本机动态SQL,创建字符串
问题描述:
我刚刚开始使用PL/SQL。我的关注如下:本机动态SQL,创建字符串
我想动态地创建一个字符串。
我尝试了以下操作,但它始终导致ORA-00900 & ORA-06512处于“Execute Immediate ...”行。
这里,我们去:
Declare
l_pre_sql varchar2(4000) := 'schema.';
l_sql varchar2(4000) := 'concat(concat(:a, :b), :c)';
l_after_sql := '.procedure(a,b,c)';
begin
execute immediate l_sql using l_pre_sql, l_sql, l_after_sql;
end;
是立即执行错误的语法?有没有其他的工作可能性?如您所见,我正在解决无法使用模式名称作为动态变量的问题。
为了澄清我基本上要做到这一点:提前
execute immediate ':a'||'.'||':b'||'.procedure(a,b,c)' using schema, name;
谢谢!
答
在预准备语句(使用Oracle和其他语言)中,可以使用参数替换查询字符串中的常量值。但是,不能替换列名称,表名称,用户(模式),过程名称等。
换句话说,替换不仅仅是通过用字符串表示替换值。它将参数插入到编译语句中。
因此,您需要先使用过程名称构造字符串,然后调用它。
我想你想的是一样的东西:
execute immediate l_pre_sql || l_after_sql || '(:a, :b, :c)' using . . .
+0
嗨,首先感谢您的回答。我知道,不允许用给定示例替换用户和过程名称 我必须承认,我在第一篇文章中弄了一下自己,有点匆忙,请原谅我 我喜欢做的是动态调用一个包含多个包的程序。假设我在每个包中都有一个'Version'过程,现在我想要一个动态的sql语句来替换包名。我可以在这里使用变量吗?因为我所有的尝试过(以上都是一个坏例子)失败了。 –
你为什么不就叫'EXECUTE IMMEDIATE l_pre_sql || l_after_sql'? (concat(schema。,concat(concat(:a,:b),:c),.procedure(a,b,c))',这根本没有任何意义。 – AndrewMcCoist
模式名称和变量名称不能用作绑定变量,它可能类似于eval中的eval。 – ibre5041