【问题标题】:Dynamic SQL table name as variable动态 SQL 表名作为变量
【发布时间】:2019-02-21 05:42:20
【问题描述】:

我有这个程序正在运行,调用过程时可以传递2个参数并执行选择查询。

create or replace procedure dynamic_sql
(input1 varchar2, input2 varchar2)
as begin
execute immediate
'select :variable1, :variable2 from emp'
using input1,input2;
end;
/
exec dynamic_sql('ename','job');

以同样的方式,我尝试添加将替换表 Emp 的第三个变量,但它不起作用,传入的表名是 100% 正确的。这是不起作用的代码(ORA-00903:无效的表名):

create or replace procedure dynamic_sql
(input1 varchar2, input2 varchar2,input_table varchar2)
as begin
execute immediate
'select :variable1, :variable2 from :variable3'
using input1,input2,input_table;
end;
/
exec dynamic_sql('ename','job','emp');

【问题讨论】:

  • 1pluszara 已经回答了您的问题,但我想指出您的程序毫无意义,因为您只是从该表中选择字符串“ename”和“job”,这几乎可以肯定不是你想要的。
  • 即使在答案版本中也是没有意义的,因为 - 正如your previous question 中所指出的 - 你必须选择 into 一些东西。没有它,动态查询将被解析 - 在您的版本中,此时会引发错误 - 但不会被执行。

标签: sql oracle dynamic-sql


【解决方案1】:

试试这样的: 这是由于在执行之前解析了表名。

create or replace procedure dynamic_sql
(input1 varchar2, input2 varchar2,input_table varchar2)
as
str varchar2(1000) := NUll; 
begin
str := 'select '||input1||','|| input2 ||' from '||input_table;
execute immediate str;
end;
/
exec dynamic_sql('ename','job','emp');

Procedure created.
 PL/SQL procedure successfully completed.   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    相关资源
    最近更新 更多