是否可以 运行 Oracle for 循环中的存储过程?
Is it possible to run a stored procedure in Oracle for loop?
我有一个关于可能性的问题。我在 Oracle 数据库版本 12c 中创建了一个存储过程。它需要一个参数才能运行。以便通过传递以下参数正确地 运行s:
EXEC My_Procedure_Name(parameter_value);
通过上面的代码 运行 一切顺利。
现在,我将 运行 这个程序(实际上是上面的代码)每天执行两个月。因此,我写了一个这样的脚本:
declare stmt varchar2(100);
begin
for i in (days of months)
loop
stmt:='EXEC My_Procedure_Name(parameter_value);';
EXECUTE IMMEDIATE stmt;
commit;
end loop;
end;
我的问题是:提到的脚本是否正确?它会起作用吗?我的脚本有问题吗?
谢谢
除此之外,您还可以在不使用立即执行但仅引用循环变量的情况下尝试以下代码 -
declare stmt varchar2(100);
begin
for i in (days of months)
loop
My_Procedure_Name(i.parameter_value);
commit;
end loop;
end;
在循环中调用过程,语法如下:
begin
for i in 1..5 loop
dbms_output.put_line(i);
end loop;
end;
我假设 for i in (days of months)
是伪代码,您实际上会使用一些有效的构造来满足您的要求。
如果你真的需要使用动态代码,那是可以做到的,但注意 PL/SQL 没有 EXEC
关键字。你需要这样的东西:
begin
for i in 1..5 loop
execute immediate 'begin dbms_output.put_line(:i); end;' using i;
end loop;
end;
或
begin
for i in 1..5 loop
execute immediate 'call dbms_output.put_line(:i)' using i;
end loop;
end;
(注意 PL/SQL 有一个 ;
语句终止符,但 SQL 没有。)
如您所见,动态代码更复杂,因此除非没有其他选择,否则最好避免使用它。
我有一个关于可能性的问题。我在 Oracle 数据库版本 12c 中创建了一个存储过程。它需要一个参数才能运行。以便通过传递以下参数正确地 运行s:
EXEC My_Procedure_Name(parameter_value);
通过上面的代码 运行 一切顺利。
现在,我将 运行 这个程序(实际上是上面的代码)每天执行两个月。因此,我写了一个这样的脚本:
declare stmt varchar2(100);
begin
for i in (days of months)
loop
stmt:='EXEC My_Procedure_Name(parameter_value);';
EXECUTE IMMEDIATE stmt;
commit;
end loop;
end;
我的问题是:提到的脚本是否正确?它会起作用吗?我的脚本有问题吗?
谢谢
除此之外,您还可以在不使用立即执行但仅引用循环变量的情况下尝试以下代码 -
declare stmt varchar2(100);
begin
for i in (days of months)
loop
My_Procedure_Name(i.parameter_value);
commit;
end loop;
end;
在循环中调用过程,语法如下:
begin
for i in 1..5 loop
dbms_output.put_line(i);
end loop;
end;
我假设 for i in (days of months)
是伪代码,您实际上会使用一些有效的构造来满足您的要求。
如果你真的需要使用动态代码,那是可以做到的,但注意 PL/SQL 没有 EXEC
关键字。你需要这样的东西:
begin
for i in 1..5 loop
execute immediate 'begin dbms_output.put_line(:i); end;' using i;
end loop;
end;
或
begin
for i in 1..5 loop
execute immediate 'call dbms_output.put_line(:i)' using i;
end loop;
end;
(注意 PL/SQL 有一个 ;
语句终止符,但 SQL 没有。)
如您所见,动态代码更复杂,因此除非没有其他选择,否则最好避免使用它。