Oracle函数:如何将表名作为参数传递,并将游标结果用作表名?

时间:2014-04-03 19:29:19

标签: sql plsql oracle11g

我正在尝试创建这个oracle函数。 基本上我想要做的是传入一个表的名称,并返回列的最大值,即列变量表名+' _ID' 所以它看起来像这样(tableName)_ID

这是我尝试过的东西(但我无法让它工作):

CREATE OR REPLACE FUNCTION RETURN_ID(tableName IN varchar2)
return int
IS 
   curResult varchar2;

   cursor cur1 is
       SELECT column_name
       FROM all_tab_cols
       WHERE table_name = tableName
       AND column_name like '%_ID';

BEGIN

   OPEN cur1;
   FETCH cur1 INTO curResult;
   CLOSE cur1;

   SELECT MAX(curResult) AS MaxID
   FROM tableName;

   RETURN maxID;
END RETURN_ID;

2 个答案:

答案 0 :(得分:2)

替换

SELECT MAX(curResult) AS MaxID
FROM tableName;

execute immediate 
  'select max(' || curResult || ')' ||
  '  from ' || tableName 
  into MaxID;

每当您想要在select语句中动态更改表名或列名时,除了诉诸execute immediate语句之外几乎总是没有别的办法。

答案 1 :(得分:0)

您需要使用动态SQL。像

这样的东西
EXECUTE IMMEDIATE 'SELECT MAX(' || tablename || '_id ) ' ||
                  '  FROM ' || tablename
   INTO maxID;