存储过程示例:使用游标处理数据

 1 CREATE OR REPLACE PROCEDURE PRODUCT_CUR_PRC AS
 2   CUR_CTGY     PRODUCTINFO.CATEGORY%TYPE; --存放产品类型编码
 3   CUR_CTGYNAME CATEGORYINFO.CATEGORYNAME%TYPE; --存放产品类型名称
 4   CUR_PRTIFO   PRODUCTINFO%ROWTYPE; --存放表productinfo的行记录
 5   
 6   CURSOR CUR_CATEGORY IS
 7     SELECT CATEGORY FROM PRODUCTINFO GROUP BY CATEGORY;
 8 
 9 BEGIN
10   OPEN CUR_CATEGORY;
11    LOOP
12     FETCH CUR_CATEGORY
13       INTO CUR_CTGY;
14     EXIT WHEN CUR_CATEGORY%NOTFOUND;
15     SELECT CATEGORYINFO.CATEGORYNAME
16       INTO CUR_CTGYNAME
17       FROM CATEGORYINFO
18      WHERE CATEGORYID = CUR_CTGY; --根据产品类型编码得到产品类型名称
19   
20     IF SQL%FOUND THEN
21       DBMS_OUTPUT.PUT_LINE('------------');
22       DBMS_OUTPUT.PUT_LINE(CUR_CTGYNAME || ':');
23     END IF;
24     
25     FOR MY_PRDINFO_REC IN (SELECT * FROM PRODUCTINFO WHERE CATEGORY = cur_ctgy) LOOP DBMS_OUTPUT.PUT_LINE('产品名称:' || MY_PRDINFO_REC.PRODUCTNAME || '产品价格:' || MY_PRDINFO_REC.PRODUCTPRICE || '产品数量:' || MY_PRDINFO_REC.QUANTITY);
26   END LOOP;
27 END LOOP; CLOSE CUR_CATEGORY;
28 END;

【代码解析】

第1行表示创建存储过程,名称是product_cur_prc;

第2~4行表示变量的名称及变量类型。

第6~7行表示创建一个游标,表示从productinfo表中查询已有的产品类型。

第10~14行表示打开cur_category游标并进入循环流提取数据,当数据提取完毕后退出。

第15~18行表示在categoryinfo表中,根据产品的编码得到产品类型名称,并把得到的结果赋值给变量cur_ctgyname。

第20~23行表示利用隐式游标%found属性判断第15~18行的查询是否有结果,如果有,则把产品类型名称输出到屏幕。

第25~28行表示利用隐式游标获取某类型的所有产品,并把产品信息输出到屏幕。

【执行如下】

SQL>exec product_cur_prc;

posted on 2015-02-26 10:18  RainbowGu  阅读(11999)  评论(0编辑  收藏  举报

导航