关于SQL存储过程使用游标循环的问题

2025-01-21 15:23:01
推荐回答(3个)
回答1:

你把具体需要做到什么,把内容写出来,还有a,b,c,3个表的表结构及关系,我来给你写存储过程,你只这样草草的说,我写出来的代码你也用不了的
游标/循环,尽量有别的方法还是不要用,数据多的话,速度很慢很慢的,贴出来我给你看看有什么别的方法替代的吗

回答2:

循环嵌套的格式打给你写了一下 以参考一下换上你的数据就行:

CREATE OR REPLACE PROCEDURE P_name
AS
定义变量如:

V$PO_NO VARCHAR2(20);

V$ITM_CD VARCHAR2(20);

V$ITM_CD1 VARCHAR2( 40);

CURSOR CUR_A

IS

SELECT *
FROM a;

CURSOR CUR_B

IS

SELECT *
FROM B;

BEGIN

OPEN CUR_A;

LOOP

FETCH CUR_A INTO 变量V$PO_NO;

EXIT WHEN CUR_A%NOTFOUND;

循环处理;

OPEN CUR_B;

LOOP

FETCH CUR_B INTO 变量V$ITM_CD;

EXIT WHEN CUR_B%NOTFOUND;

次循环处理;

END LOOP ;

CLOSE CUR_B;

END LOOP ;

CLOSE CUR_A;

COMMIT;

异常处理:

EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE( '无值');

ROLLBACK;

WHEN OTHERS THEN

P$RET:= SQLCODE;

ROLLBACK;

END;

回答3:

--方法就这些 具体还是要你自己 理解 怎么灵活运用
begin tran   
declare @aID int
declare cur4 cursor for 
SELECT a.[ID] from tbA
OPEN cur4
fetch cur4 into @aID
while  @@FETCH_STATUS = 0
BEGIN
------------------------------
INSERT INTO tbC (tbC.cls01,tbC.cls02)
SELECT tbB.cls01,tbB.cls02 FROM tbB WHERE tbB.cls01=@aID
--------------------------
fetch cur4 INTO @aID
END
close cur4
deallocate cur4
if @@error<>0 or @@rowcount<>1
begin
    rollback tran
end
else
begin
        commit tran
end