如何在过程oracle中将表名设置为参数

Posted

技术标签:

【中文标题】如何在过程oracle中将表名设置为参数【英文标题】:how to set table name as parameter in procedure oracle 【发布时间】:2014-07-23 23:07:40 【问题描述】:

我在 Oracle 中有一个过程,它返回所有回答 SQL 语句的行。 该程序得到4个参数,其中3个使用在-所说的SQL语句中。往下看(代码)。 只有参数:in_table_name 会报错,如何通过过程将table_name 移动到SQL 语句中?(我试过用“&”,但是不行)

create or replace Procedure return_rows_EMPLOYEE (in_order in number, 
in_sorting in VARCHAR2, in_job in VARCHAR2, in_table_name in VARCHAR2, out_cursor OUT SYS_REFCURSOR) As
Begin
  if in_order = 1 THEN
     OPEN out_cursor for
     select * from &in_table_name
     WHERE EMPL_JOB_TITLE = in_job
     ORDER BY in_sorting ASC;
  else
     OPEN out_cursor for
     select * from &in_table_name
     WHERE EMPL_JOB_TITLE = in_job
     ORDER BY in_sorting DESC;
    END if;
End;

【问题讨论】:

使用动态查询。你不能使用表名作为参数。 【参考方案1】:

正如 Rahul 指出的,您不能使用表名作为参数。但我还要补充一点,您不能在EXECUTE IMMEDIATE 子句中使用表名作为USING 参数。您必须在查询中实际连接它。下面是(未经测试!)结果查询。

create or replace Procedure return_rows_EMPLOYEE (in_order in number, 
in_sorting in VARCHAR2, in_job in VARCHAR2, in_table_name in VARCHAR2, out_cursor OUT SYS_REFCURSOR) 
As
query varchar2(4000);
Begin
  if in_order = 1 THEN
     query := 
     'select * from ' || in_table_name ||
     ' WHERE EMPL_JOB_TITLE = :1
      ORDER BY :2 ASC';
  else
     OPEN out_cursor for
     query := 
     'select * from ' || in_table_name ||
     ' WHERE EMPL_JOB_TITLE = :1
      ORDER BY :2 DESC';
  end if;

  open out_cursor for query using in_job, in_sorting;
End;

【讨论】:

以上是关于如何在过程oracle中将表名设置为参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 oracle 存储过程中将对象类型设置为 out?

如何在存储过程中动态传递表名 - ORACLE [重复]

如何在存储过程中删除一张表,表名是作为参数传入的

如何在oracle中将对象类型的对象作为参数传递

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

在 Oracle 11g 的过程中将 REFCURSOR 变量打印为 OUT 参数时出错