Oracle 在PL/SQL中,我可以通过存储过程参数传递游标FROM子句的表模式吗?

Oracle 在PL/SQL中,我可以通过存储过程参数传递游标FROM子句的表模式吗?,oracle,plsql,Oracle,Plsql,在PL/SQL中,我希望将“源”模式作为参数传递给存储过程。例如: BEGIN CURSOR my_cursor IS SELECT my_field FROM <schema>.my_table ... 开始 光标我的光标是 从.my_表中选择my_字段 ... 我希望“schema”值来自存储过程中的输入参数。有人知道我是怎么做到的吗 请注意,如果这是一个愚蠢的简单问题,我很抱歉,但我是PL/SQL新手,必须快速编写一些函数。这必须通过动态SQL来完成 D

在PL/SQL中,我希望将“源”模式作为参数传递给存储过程。例如:

BEGIN
    CURSOR my_cursor IS
      SELECT my_field FROM <schema>.my_table
...
开始
光标我的光标是
从.my_表中选择my_字段
...
我希望“schema”值来自存储过程中的输入参数。有人知道我是怎么做到的吗


请注意,如果这是一个愚蠢的简单问题,我很抱歉,但我是PL/SQL新手,必须快速编写一些函数。

这必须通过动态SQL来完成

DBMS_SQL包或executeimmediate语句

不能在FROM子句中使用变量

一个可能的解决办法是


ALTER SESSION SET Current_Schema=''除了Mark Brady所说的之外,另一个动态SQL选项是使用REF游标。因为您的示例代码包含一个游标,所以这是最相关的

PROCEDURE select_from_schema( the_schema VARCHAR2)
IS
  TYPE my_cursor_type IS REF CURSOR;
  my_cursor  my_cursor_type;
BEGIN
  OPEN my_cursor FOR 'SELECT my_field FROM '||the_schema||'.my_table';

  -- Do your FETCHes just as with a normal cursor

  CLOSE my_cursor;
END;

这正是ref游标的作用。。有一些缺点(类型检查?),但适用于您的想法。如果您使用9i或更高版本,您可以取消类型声明,只需将my_cursor声明为SYS_refCursor类型或SQL注入软件。如果采用这种方法,您必须了解任何动态SQL方法的SQL注入。但在本例中,我猜模式名称不是直接来自用户输入。不,这里的模式来自服务器本身的配置文件。对于开发人员来说,切换数据馈送所在的模式只是一个后门。