本机动态SQL,创建字符串

本机动态SQL,创建字符串,sql,oracle,dynamic,plsql,Sql,Oracle,Dynamic,Plsql,我刚刚开始学习PL/SQL。我关注的问题如下: 我想动态创建一个字符串 我尝试了下面的方法,但它总是在“立即执行…”行中显示ORA-00900和ORA-06512 我们开始: Declare l_pre_sql varchar2(4000) := 'schema.'; l_sql varchar2(4000) := 'concat(concat(:a, :b), :c)'; l_after_sql := '.procedure(a,b,c)'; begin e

我刚刚开始学习PL/SQL。我关注的问题如下:

我想动态创建一个字符串

我尝试了下面的方法,但它总是在“立即执行…”行中显示ORA-00900和ORA-06512

我们开始:

    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的语法是否错误?还有其他工作的可能性吗?正如您可能看到的,我正在解决一个问题,即不能使用模式名作为动态变量

为了澄清,我基本上想这样做:

execute immediate ':a'||'.'||':b'||'.procedure(a,b,c)' using schema, name;
提前谢谢

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

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

因此,首先需要用过程名构造字符串,然后调用它

我想你想要的是:

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

为什么不直接调用
executeimmediate l_pre_sql | l|u after_sql
?您现在调用的是
concat(concat(schema.,concat(concat(:a,:b),:c),.procedure(a,b,c))
这毫无意义。模式名和变量名不能用作绑定变量。它类似于eval中的eval。嘿,首先感谢你的回答。我知道不允许用我的示例替换用户和过程名。我必须承认,我在第一篇文章中有点欺骗自己。我我有点匆忙,请原谅。我喜欢做的是动态调用几个包中的过程。假设我要调用的每个包中都有一个过程“版本”。现在我想用一个动态sql语句来替换包名。我可以在这里使用变量吗?因为我所做的一切(以上只是一个坏例子)失败了。