【问题标题】:Is it possible to run a stored procedure in Oracle for loop?是否可以在 Oracle for 循环中运行存储过程?
【发布时间】:2020-09-01 11:56:41
【问题描述】:

我有一个关于可能性的问题。我在 Oracle 数据库版本 12c 中创建了一个存储过程。它需要一个参数才能运行。这样它就可以通过传递如下参数来正确运行:

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;

我的问题是:上述脚本是否正确?它会起作用吗?我的脚本有问题吗?

谢谢

【问题讨论】:

    标签: sql oracle stored-procedures plsql


    【解决方案1】:

    要在循环中调用过程,语法如下:

    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 没有。)

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

    【讨论】:

    • 这被认为是一个很好的解决方案。谢谢威廉
    【解决方案2】:

    您可以尝试下面的代码而不使用立即执行,而只是引用循环变量 -

    declare stmt varchar2(100);
     begin
       for i in (days of months)
      loop
        My_Procedure_Name(i.parameter_value);
        commit;
      end loop;
     end;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-10
      • 2021-04-03
      • 2020-10-11
      • 1970-01-01
      • 2020-01-03
      • 2010-11-10
      • 2012-10-04
      • 1970-01-01
      相关资源
      最近更新 更多