Ora学习笔记-游标的使用-06-05-24
/*
**************************************
* Oracle 游标示例 *
**************************************
*/
**************************************
* Oracle 游标示例 *
**************************************
*/
--(1)声名游标 用一个查询定义游标的行和列
DECLARE
CURSOR nextRecodeRow IS
SELECT * FROM JHJ_DZ_TEST_RESULT
WHERE JHJX=41
ORDER BY YWMC;
--用%ROWTYPE属性声名的记录变量自动拥有对应于所引用镖的字段的字段名
RecodeRow_DZ JHJ_DZ_TEST_RESULT%ROWTYPE;
DECLARE
CURSOR nextRecodeRow IS
SELECT * FROM JHJ_DZ_TEST_RESULT
WHERE JHJX=41
ORDER BY YWMC;
--用%ROWTYPE属性声名的记录变量自动拥有对应于所引用镖的字段的字段名
RecodeRow_DZ JHJ_DZ_TEST_RESULT%ROWTYPE;
--声名带参数的游标
CURSOR nextRecodeRow_with_var (JHJDM INTEGER) IS
SELECT * FROM JHJ_XYW_TEST_RESULT
WHERE JHJX=JHJDM
ORDER BY YWMC,JX,XH;
RecodeRow_XYW JHJ_XYW_TEST_RESULT%ROWTYPE;
CURSOR nextRecodeRow_with_var (JHJDM INTEGER) IS
SELECT * FROM JHJ_XYW_TEST_RESULT
WHERE JHJX=JHJDM
ORDER BY YWMC,JX,XH;
RecodeRow_XYW JHJ_XYW_TEST_RESULT%ROWTYPE;
BEGIN
DBMS_OUTPUT.put_line('----------以下显示普通游标记录-----------');
--(2) 打开游标
OPEN nextRecodeRow;
--(3) 用 FETCH ... INTO ... 从游标中取出行
FETCH nextRecodeRow INTO RecodeRow_DZ;
WHILE nextRecodeRow%FOUND LOOP
DBMS_OUTPUT.put_line(RecodeRow_DZ.ywmc||' == '||RecodeRow_DZ.jhjzl);
FETCH nextRecodeRow INTO RecodeRow_DZ;
END LOOP;
--(4) 用 CLOSE 关闭游标
CLOSE nextRecodeRow;
DBMS_OUTPUT.put_line('----------普通游标记录显示完毕-----------');
DBMS_OUTPUT.put_line('**********以下显示游标FOR记录************');
--游标FOR循环自动声名一个能够接受游标中的行,
--打开游标,从游标中取出行以及在游标中的最后一行取出后关闭游标的变量或记录
FOR RecodeRow_DZ IN nextRecodeRow LOOP
DBMS_OUTPUT.put_line(RecodeRow_DZ.jhjx||' == '||RecodeRow_DZ.jx);
END LOOP;
DBMS_OUTPUT.put_line('**********游标FOR记录显示完毕************');
DBMS_OUTPUT.put_line('==========以下显示带参游标记录===========');
--通过游标FOR调用带参数的游标
FOR RecodeRow_XYW IN nextRecodeRow_with_var(51) LOOP
DBMS_OUTPUT.put_line(RecodeRow_XYW.jx||' ** '||RecodeRow_XYW.xh);
END LOOP;
DBMS_OUTPUT.put_line('==========带参游标记录显示完毕===========');
DBMS_OUTPUT.put_line('----------以下显示普通游标记录-----------');
--(2) 打开游标
OPEN nextRecodeRow;
--(3) 用 FETCH ... INTO ... 从游标中取出行
FETCH nextRecodeRow INTO RecodeRow_DZ;
WHILE nextRecodeRow%FOUND LOOP
DBMS_OUTPUT.put_line(RecodeRow_DZ.ywmc||' == '||RecodeRow_DZ.jhjzl);
FETCH nextRecodeRow INTO RecodeRow_DZ;
END LOOP;
--(4) 用 CLOSE 关闭游标
CLOSE nextRecodeRow;
DBMS_OUTPUT.put_line('----------普通游标记录显示完毕-----------');
DBMS_OUTPUT.put_line('**********以下显示游标FOR记录************');
--游标FOR循环自动声名一个能够接受游标中的行,
--打开游标,从游标中取出行以及在游标中的最后一行取出后关闭游标的变量或记录
FOR RecodeRow_DZ IN nextRecodeRow LOOP
DBMS_OUTPUT.put_line(RecodeRow_DZ.jhjx||' == '||RecodeRow_DZ.jx);
END LOOP;
DBMS_OUTPUT.put_line('**********游标FOR记录显示完毕************');
DBMS_OUTPUT.put_line('==========以下显示带参游标记录===========');
--通过游标FOR调用带参数的游标
FOR RecodeRow_XYW IN nextRecodeRow_with_var(51) LOOP
DBMS_OUTPUT.put_line(RecodeRow_XYW.jx||' ** '||RecodeRow_XYW.xh);
END LOOP;
DBMS_OUTPUT.put_line('==========带参游标记录显示完毕===========');
END;