我刚刚开始使用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 ':a'||'.'||':b'||'.procedure(a,b,c)' using schema, name;
提前致谢!
答案 0 :(得分:1)
在预准备语句中(在Oracle和其他语言中),您可以使用参数替换查询字符串中的常量值。但是,您无法替换列名,表名,用户(模式),过程名称等。
换句话说,替换不仅仅是用字符串表示替换值。它将参数插入到编译语句中。
因此,您需要首先使用过程名称构造字符串,然后调用它。
我认为你想要的是:
execute immediate l_pre_sql || l_after_sql || '(:a, :b, :c)' using . . .