如何在Oracle中使用游标在存储过程中执行存储过程
How to execute Stored Procedure inside Stored Procedure with Cursor in Oracle
我是 Oracle 的新手,
在 SQL 服务器中,我可以轻松地在存储过程中执行存储过程
甚至使用光标。
现在我无法在 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);
只需删除 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;
很简单,不是吗?
我是 Oracle 的新手, 在 SQL 服务器中,我可以轻松地在存储过程中执行存储过程 甚至使用光标。
现在我无法在 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);
只需删除 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;
很简单,不是吗?