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

Oracle 如何使用变量中的参数执行存储过程?,oracle,stored-procedures,plsql,Oracle,Stored Procedures,Plsql,我有一个包含存储过程名称的变量。我想用动态sql执行这个过程,所以我这样做了: var_procedure是包含存储过程名称的变量firstparameter和secondone是存储过程的varchar参数 execute immediate var_procedure||'('''||firstparameter||''','''||secondone||''')'; create or replace procedure my_proc (a varchar2, b varchar2)

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

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

execute immediate var_procedure||'('''||firstparameter||''','''||secondone||''')';
create or replace procedure my_proc (a varchar2, b varchar2)
as
begin
  dbms_output.put_line ('a= '||a||' b = '||b);
end;
/
它不工作,我打印了这个基本错误:

ORA-00900: invalid SQL statement

你有解决办法吗?

让我们一步一步地试试

这是你的程序

execute immediate var_procedure||'('''||firstparameter||''','''||secondone||''')';
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个字符)


让我们一步一步地试一下

这是你的程序

execute immediate var_procedure||'('''||firstparameter||''','''||secondone||''')';
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个字符)


谢谢你的建议,但这不是我面临的问题。事实上,我有一个变量,它包含我要执行的过程的名称。正如所解释的,var_过程不是过程的名称。@盖茨比理解并添加了一个example@Gatsby当前位置如果你发现这个问题工作得很好,那么最好把它标记为正确。谢谢你的建议,但这不是我面临的问题。事实上,我有一个变量,它包含我要执行的过程的名称。正如所解释的,var_过程不是过程的名称。@盖茨比理解并添加了一个example@Gatsby:如果发现问题运行良好,最好将其标记为正确。您可以尝试将过程调用构建到VARCHAR2中,并在执行之前或异常块中显示它。您可能没有收到预期的结果。您可以尝试将过程调用构建到VARCHAR2中,并在EXECUTE之前或异常块中显示它。您可能没有收到预期的结果。