本机动态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; 

谢谢!

+0

你为什么不就叫'EXECUTE IMMEDIATE l_pre_sql || l_after_sql'? (concat(schema。,concat(concat(:a,:b),:c),.procedure(a,b,c))',这根本没有任何意义。 – AndrewMcCoist

+0

模式名称和变量名称不能用作绑定变量,它可能类似于eval中的eval。 – ibre5041

在预准备语句(使用Oracle和其他语言)中,可以使用参数替换查询字符串中的常量值。但是,不能替换列名称,表名称,用户(模式),过程名称等。

换句话说,替换不仅仅是通过用字符串表示替换值。它将参数插入到编译语句中。

因此,您需要先使用过程名称构造字符串,然后调用它。

我想你想的是一样的东西:

execute immediate l_pre_sql || l_after_sql || '(:a, :b, :c)' using . . . 
+0

嗨,首先感谢您的回答。我知道​​,不允许用给定示例替换用户和过程名称 我必须承认,我在第一篇文章中弄了一下自己,有点匆忙,请原谅我 我喜欢做的是动态调用一个包含多个包的程序。假设我在每个包中都有一个'Version'过程,现在我想要一个动态的sql语句来替换包名。我可以在这里使用变量吗?因为我所有的尝试过(以上都是一个坏例子)失败了。 –