是否可以 运行 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 没有。)

如您所见,动态代码更复杂,因此除非没有其他选择,否则最好避免使用它。