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

Posted

技术标签:

【中文标题】Oracle函数:如何将表名作为参数传递,并使用游标结果作为表名?【英文标题】:Oracle functions: How to pass a table name as parameter, and use a cursor result as a table name? 【发布时间】:2014-04-03 19:29:18 【问题描述】:

我在尝试创建的这个 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;

【问题讨论】:

【参考方案1】:

替换

SELECT MAX(curResult) AS MaxID
FROM tableName;

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

每当您想在 select 语句中动态更改表名或列名时,几乎总是没有其他办法,只能诉诸 execute immediate 语句。

【讨论】:

【参考方案2】:

您需要使用动态 SQL。类似的东西

EXECUTE IMMEDIATE 'SELECT MAX(' || tablename || '_id ) ' ||
                  '  FROM ' || tablename
   INTO maxID;

【讨论】:

以上是关于Oracle函数:如何将表名作为参数传递,并使用游标结果作为表名?的主要内容,如果未能解决你的问题,请参考以下文章

通过将表名作为参数传递,使用 oracle 中的存储过程从表中搜索数据

在 MySQL 中:如何将表名作为存储过程和/或函数参数传递?

存储过程,将表名作为参数传递

将表名作为参数传递时 PL/SQL 函数不起作用

将表名传递给函数并返回表

如何将表作为参数传递并使用 plsql 过程填充该表