【问题标题】:How to execute Stored Procedure inside Stored Procedure with Cursor in Oracle如何在Oracle中使用游标在存储过程中执行存储过程
【发布时间】:2018-02-22 16:10:12
【问题描述】:

我是 Oracle 的新手, 在 SQL Server 中,我可以轻松地在存储过程中执行存储过程 甚至使用光标。

现在我在 Oracle 中无法弄清楚,下面是我的代码。

CREATE OR REPLACE PROCEDURE ZSP_INSMASTERDATASTM
AS
   l_total        INTEGER := 10000;

   CURSOR c1
   IS
      SELECT DISTINCT PRODFROMTO FROM DJ_P9945LINKS;

   l_PRODFROMTO   c1%ROWTYPE;
BEGIN
   OPEN c1;

   LOOP
      FETCH c1 INTO l_PRODFROMTO;

      EXIT WHEN c1%NOTFOUND;

      EXECUTE ZSP_GETMASTERDATASTM (l_PRODFROMTO);

      EXIT WHEN l_total <= 0;
   END LOOP;

   CLOSE c1;
END ZSP_INSMASTERDATASTM;

我在执行 ZSP_GETMASTERDATASTM (l_PRODFROMTO) 时出错;

【问题讨论】:

    标签: oracle cursor


    【解决方案1】:

    只需删除EXECUTE。但是,请注意,您的循环将永远不会退出,因为 L_TOTAL 永远不会小于零 - 您应该修复它。

    否则,请考虑使用游标 FOR 循环,因为它更易于维护 - 您不必声明游标变量、打开游标、获取、退出循环、关闭游标。看看这个例子:

    CREATE OR REPLACE PROCEDURE zsp_insmasterdatastm
    AS
    BEGIN
       FOR cur_r IN (SELECT DISTINCT prodfromto FROM dj_p9945links)
       LOOP
          zsp_getmasterdatastm (cur_r.prodfromto);
       END LOOP;
    END;
    

    很简单,不是吗?

    【讨论】:

    • 这个确实简单多了;不过,只是对您的观察的观察:原始循环不会退出 因为l_total,因为它永远不会被调整并且目前是无节点的;但至少会在游标结果集耗尽时退出。
    • 对;谢谢你,@Alex - 我错过了EXIT WHEN c1%NOTFOUND;
    • 谢谢你们!
    猜你喜欢
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    相关资源
    最近更新 更多