【发布时间】:2010-09-21 16:31:46
【问题描述】:
在 PL/SQL 中,我想将“源”模式作为参数传递给存储过程。例如:
BEGIN
CURSOR my_cursor IS
SELECT my_field FROM <schema>.my_table
...
我希望“模式”值来自存储过程的输入参数。有谁知道我该怎么做?
附:对不起,如果这是一个愚蠢的简单问题,但我是 PL/SQL 新手,必须快速编写一些函数。
【问题讨论】:
在 PL/SQL 中,我想将“源”模式作为参数传递给存储过程。例如:
BEGIN
CURSOR my_cursor IS
SELECT my_field FROM <schema>.my_table
...
我希望“模式”值来自存储过程的输入参数。有谁知道我该怎么做?
附:对不起,如果这是一个愚蠢的简单问题,但我是 PL/SQL 新手,必须快速编写一些函数。
【问题讨论】:
这必须使用动态 sql 来完成。
DBMS_SQL 包或 Execute Immediate 语句。
您不能在 FROM 子句中使用变量。
一个潜在的解决方案可能是
ALTER SESSION SET Current_Schema = ''
该命令会更改默认架构。所以如果你有一堆同名的表,你可以为自己保存动态 SQL 并创建一个动态更改会话。
【讨论】:
除了 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;
【讨论】: