gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:40:03 25 4
gpt4 key购买 nike

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

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

execute immediate var_procedure||'('''||firstparameter||''','''||secondone||''')';

它不工作,我打印了这个基本错误:

ORA-00900: invalid SQL statement

你有解决办法吗?

最佳答案

让我们逐步尝试。

这是你的程序。

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 注入(inject)的不良做法。

declare
a varchar2(5) := 'a';
b varchar2(5) := 'b';
begin
execute immediate 'begin
my_proc('''||a||''','''||b||''');
end;';
end;
/

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

declare
a varchar2(5) := 'a';
b varchar2(5) := 'b';
begin
execute immediate 'begin
my_proc(:a,:b);
end;' USING a,b;
end;
/

要动态传递过程的名称,您必须连接语句,因此如果参数不受您的控制(至少将长度限制为 30 个字符),请注意避免 SQL 注入(inject)。

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;
/

关于oracle - 如何使用变量中的参数执行存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47377395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com