CREATEORREPLACEPROCEDURE PRC_LJ IS CURSOR C_EMP IS--声明显式游标 SELECT EMPNO,ENAME FROM EMP; C_ROW C_EMP%ROWTYPE; --定义游标变量,该变量的类型为基于游标C_EMP的记录 BEGIN --For 循环 FOR C_ROW IN C_EMP LOOP DBMS_OUTPUT.PUT_LINE(C_ROW.EMPNO || '--' || C_ROW.ENAME); ENDLOOP; --Fetch 循环 OPEN C_EMP;--必须要明确的打开和关闭游标 LOOP FETCH C_EMP INTO C_ROW; EXIT WHEN C_EMP%NOTFOUND; DBMS_OUTPUT.PUT_LINE(C_ROW.EMPNO || '++' || C_ROW.ENAME); ENDLOOP; CLOSE C_EMP; --While 循环 OPEN C_EMP;--必须要明确的打开和关闭游标 FETCH C_EMP INTO C_ROW; WHILE C_EMP%FOUND LOOP DBMS_OUTPUT.PUT_LINE(C_ROW.EMPNO || '**' || C_ROW.ENAME); FETCH C_EMP INTO C_ROW; ENDLOOP; CLOSE C_EMP; END PRC_LJ;
createorreplaceprocedure myprocedure is CURSOR CUR_TEST IS--声明显式游标 SELECT ECODE,ENAME FROM EMP; --定义游标变量,该变量的类型为基于游标C_EMP的记录 CUR CUR_TEST%ROWTYPE; BEGIN --For 循环 FOR CUR IN CUR_TEST LOOP --循环体 DBMS_OUTPUT.PUT_LINE('员工编号:'||CUR.ECODE ||'员工姓名:'|| CUR.ENAME); ENDLOOP; --Fetch 循环 OPEN CUR_TEST;--必须要明确的打开和关闭游标 LOOP FETCH CUR_TEST INTO CUR; EXIT WHEN CUR_TEST%NOTFOUND; --循环体 DBMS_OUTPUT.PUT_LINE('员工编号:'||CUR.ECODE ||'员工姓名:'|| CUR.ENAME); ENDLOOP; CLOSE C_EMP; --While 循环 OPEN CUR_TEST;--必须要明确的打开和关闭游标 FETCH CUR_TEST INTO CUR; WHILE CUR_TEST%FOUND LOOP --循环体 DBMS_OUTPUT.PUT_LINE('员工编号:'||CUR.ECODE ||'员工姓名:'|| CUR.ENAME); FETCH CUR_TEST INTO CUR; ENDLOOP; CLOSE C_EMP; END myprocedure;
既然遍历这么好用,那么举几个例子吧
1 2 3 4 5 6 7 8 9 10 11 12 13
DECLARE My_Cursor CURSOR--定义游标 FOR (SELECT * FROM dbo.MemberAccount) --查出需要的集合放到游标中 OPEN My_Cursor; --打开游标 FETCH NEXT FROM My_Cursor ; --读取第一行数据 WHILE @@FETCH_STATUS = 0 BEGIN --UPDATE dbo.MemberAccount SET UserName = UserName + 'A' WHERE CURRENT OF My_Cursor; --更新 --DELETE FROM dbo.MemberAccount WHERE CURRENT OF My_Cursor; --删除 FETCHNEXTFROM My_Cursor; --读取下一行数据 END CLOSE My_Cursor; --关闭游标 DEALLOCATE My_Cursor; --释放游标 GO
利用游标循环更新、删除MemberAccount表中的数据
1 2 3 4 5 6 7 8 9 10 11 12 13
DECLARE My_Cursor CURSOR--定义游标 FOR (SELECT * FROM dbo.MemberAccount) --查出需要的集合放到游标中 OPEN My_Cursor; --打开游标 FETCH NEXT FROM My_Cursor ; --读取第一行数据 WHILE @@FETCH_STATUS = 0 BEGIN --UPDATE dbo.MemberAccount SET UserName = UserName + 'A' WHERE CURRENT OF My_Cursor; --更新 --DELETE FROM dbo.MemberAccount WHERE CURRENT OF My_Cursor; --删除 FETCHNEXTFROM My_Cursor; --读取下一行数据 END CLOSE My_Cursor; --关闭游标 DEALLOCATE My_Cursor; --释放游标 GO
利用游标循环更新MemberService表中的数据(更新每个用户所购买服务的时间)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
DECLARE @UserId varchar(50) DECLARE My_Cursor CURSOR--定义游标 FOR (SELECT UserId FROM dbo.MemberAccount) --查出需要的集合放到游标中 OPEN My_Cursor; --打开游标 FETCH NEXT FROM My_Cursor INTO @UserId; --读取第一行数据(将MemberAccount表中的UserId放到@UserId变量中) WHILE @@FETCH_STATUS = 0 BEGIN PRINT @UserId; --打印数据(打印MemberAccount表中的UserId) UPDATE dbo.MemberService SET ServiceTime = DATEADD(Month, 6, getdate()) WHERE UserId = @UserId; --更新数据 FETCH NEXT FROM My_Cursor INTO @UserId; --读取下一行数据(将MemberAccount表中的UserId放到@UserId变量中) END CLOSE My_Cursor; --关闭游标 DEALLOCATE My_Cursor; --释放游标 GO