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;