【问题标题】:In PL/SQL, can I pass the table schema of a cursor FROM clause via a stored procedure parameter?在 PL/SQL 中,我可以通过存储过程参数传递游标 FROM 子句的表模式吗?
【发布时间】:2010-09-21 16:31:46
【问题描述】:

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

BEGIN
    CURSOR my_cursor IS
      SELECT my_field FROM <schema>.my_table
...

我希望“模式”值来自存储过程的输入参数。有谁知道我该怎么做?

附:对不起,如果这是一个愚蠢的简单问题,但我是 PL/SQL 新手,必须快速编写一些函数。

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    这必须使用动态 sql 来完成。

    DBMS_SQL 包或 Execute Immediate 语句。

    您不能在 FROM 子句中使用变量。

    一个潜在的解决方案可能是

    ALTER SESSION SET Current_Schema = ''

    该命令会更改默认架构。所以如果你有一堆同名的表,你可以为自己保存动态 SQL 并创建一个动态更改会话。

    【讨论】:

      【解决方案2】:

      除了 Mark Brady 所说的之外,另一个动态 SQL 选项是使用 REF CURSOR。由于您的示例代码包含一个游标,这将是最相关的。

      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;
      

      【讨论】:

      • 这正是引用游标的用途......一些缺点(类型检查?),但适用于您的想法。
      • 如果您使用的是 9i 或更高版本,则可以取消 TYPE 声明,只需将 my_cursor 声明为 SYS_REFCURSOR 类型
      • 如果采取这种方法,请注意 SQL 注入
      • 您必须注意使用任何动态 SQL 方法的 SQL 注入。但在这种情况下,我猜模式名称不是直接来自用户输入。
      • 不,这里的模式来自服务器本身的配置文件。它只是开发人员切换数据馈送所流经的架构的后门。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      • 1970-01-01
      • 2011-09-04
      相关资源
      最近更新 更多