如何使用变量中的参数执行存储过程?

Gat*_*sby 1 oracle plsql stored-procedures

我有一个包含存储过程名称的变量.我想用动态sql执行这个过程,所以我这样做了:

var_procedure是包含我的存储过程名称的变量.firstparametersecondone是存储过程的varchar参数.

execute immediate var_procedure||'('''||firstparameter||''','''||secondone||''')';
Run Code Online (Sandbox Code Playgroud)

它没有用,我打印出这个基本错误:

ORA-00900: invalid SQL statement
Run Code Online (Sandbox Code Playgroud)

你有解决方案吗 ?

Mar*_*ber 5

让我们一步一步来试试吧.

这是你的程序.

create or replace procedure my_proc (a varchar2, b varchar2)
as
begin
  dbms_output.put_line ('a= '||a||' b = '||b);
end;
/
Run Code Online (Sandbox Code Playgroud)

这是如何在PL/SQL中直接调用它的方法

begin 
   my_proc('x','y');
end; 
/
Run Code Online (Sandbox Code Playgroud)

这是错误的方式如何动态执行.为什么?在语句中连接参数是启用SQL注入的不良做法.

declare
a varchar2(5) := 'a';
b varchar2(5) := 'b';
begin
  execute immediate 'begin 
   my_proc('''||a||''','''||b||''');
end;';
end;
/
Run Code Online (Sandbox Code Playgroud)

这是使用绑定变量的正确方法:

declare
a varchar2(5) := 'a';
b varchar2(5) := 'b';
begin
  execute immediate 'begin 
   my_proc(:a,:b);
end;' USING a,b;
end;
/
Run Code Online (Sandbox Code Playgroud)

要动态传递过程的名称,您必须连接该语句,因此如果参数不在您的控制之下,请小心避免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;
/
Run Code Online (Sandbox Code Playgroud)