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;