我有一个包含存储过程名称的变量。我想用动态sql执行这个过程,所以我这样做了:
var_procedure 是包含我的存储过程名称的变量。 firstparameter 和 secondone 是存储过程的varchar参数。
execute immediate var_procedure||'('''||firstparameter||''','''||secondone||''')';
它无效,我打印出这个基本错误:
ORA-00900: invalid SQL statement
你有解决方案吗?
答案 0 :(得分:5)
让我们一步一步地尝试。
这是你的程序。
create or replace procedure my_proc (a varchar2, b varchar2)
as
begin
dbms_output.put_line ('a= '||a||' b = '||b);
end;
/
这是如何在PL / SQL
中直接调用它的方法begin
my_proc('x','y');
end;
/
这是错误方式如何动态执行。 为什么?在语句中连接参数是启用SQL注入的不良做法。
declare
a varchar2(5) := 'a';
b varchar2(5) := 'b';
begin
execute immediate 'begin
my_proc('''||a||''','''||b||''');
end;';
end;
/
这是使用绑定变量的正确方法:
declare
a varchar2(5) := 'a';
b varchar2(5) := 'b';
begin
execute immediate 'begin
my_proc(:a,:b);
end;' USING a,b;
end;
/
要动态传递过程的名称,您必须连接该语句,因此如果参数不在您的控制范围内,请注意避免使用SQL注入(最小值是将长度限制为30个字符)。
declare
proc_name varchar2(30) := 'my_proc';
a varchar2(5) := 'a';
b varchar2(5) := 'b';
begin
execute immediate 'begin '||
proc_name||'(:a,:b);
end;' USING a,b;
end;
/