1 CREATE OR REPLACE PROCEDURE PRODUCT_TEMP_UPDATE_PRC AS 2 PC_DELESTR VARCHAR2(50); --刪除臨時表記錄語句 3 PC_CREATESTR VARCHAR2(500); --創建臨時表 4 TABEXT VARCHAR2(10); --用於判斷臨時表是否存在中間變量 5 6 CUR_CTGY PRODUCTINFO.CATEGORY%TYPE; 7 CUR_PRTIFO PRODUCTINFO%ROWTYPE; 8 9 CURSOR CUR_CATEGORY --產品表中的產品類型游標 10 IS 11 SELECT CATEGORY FROM PRODUCTINFO GROUP BY CATEGORY; 12 13 CURSOR CUR_PROINFO(CTGY VARCHAR) IS 14 SELECT * 15 FROM (SELECT * 16 FROM PRODUCTINFO 17 WHERE CATEGORY = CTGY 18 ORDER BY PRODUCTPRICE ASC) 19 WHERE ROWNUM < 2; 20 21 BEGIN 22 SELECT COUNT(1) 23 INTO TABEXT 24 FROM ALL_TABLES 25 WHERE TABLE_NAME = 'productinfo_tmp'; 26 27 PC_DELESTR := 'delete from productinfo_tmp'; 28 PC_CREATESTR := 'create global temporary table productinfo_tmp 29 (productid varchar2(10) not null, 30 productname varchar2 (20), 31 productprice number(8,2), 32 quantity number(10), 33 category varchar2(10), 34 desperaction varchar2(1000), 35 origin varchar2(10))on commit preserve rows'; 36 37 IF TABEXT = 0 THEN 38 --不存在臨時表就創建一個 39 EXECUTE IMMEDIATE PC_CREATESTR; 40 DBMS_OUTPUT.PUT_LINE('創建臨時表成功!'); 41 ELSE 42 EXECUTE IMMEDIATE PC_DELESTR; 43 DBMS_OUTPUT.PUT_LINE('刪除記錄完成!'); 44 END IF; 45 OPEN CUR_CATEGORY; 46 LOOP 47 FETCH CUR_CATEGORY 48 INTO CUR_CTGY; 49 EXIT WHEN CUR_CATEGORY%NOTFOUND; 50 OPEN CUR_PROINFO(CUR_CTGY); 51 FETCH CUR_PROINFO 52 INTO CUR_PRTIFO; 53 IF CUR_PROINFO%FOUND THEN 54 IF CUR_PRTIFO.PRODUCTPRICE < 20 THEN 55 ---產品價格低於20 56 DBMS_OUTPUT.PUT_LINE('產品ID' || CUR_PRTIFO.PRODUCTID || '產品名稱' || 57 CUR_PRTIFO.PRODUCTNAME || '產品價格' || 58 CUR_PRTIFO.PRODUCTPRICE); 59 ELSE 60 --非低於20價格的產品輸入到臨時表productinfo_tmp 61 EXECUTE IMMEDIATE 'insert into productinfo_tmp( 62 productid,productname,productprice,quantity,category,desperaction,origin) values 63 (''' || CUR_PRTIFO.PRODUCTID || ''',''' || 64 CUR_PRTIFO.PRODUCTNAME || ''',''' || 65 CUR_PRTIFO.PRODUCTPRICE || ''',''' || 66 CUR_PRTIFO.QUANTITY || ''',''' || 67 CUR_PRTIFO.CATEGORY || ''',''' || 68 CUR_PRTIFO.DESPERACTION || ''',''' || 69 CUR_PRTIFO.ORIGIN || ''')'; 70 END IF; 71 END IF; 72 CLOSE CUR_PROINFO; 73 END LOOP; 74 COMMIT; 75 CLOSE CUR_CATEGORY; 76 EXECUTE IMMEDIATE 'update productinfo_tmp set desperaction = ''熱銷產品'''; 77 END;
第1行表示創建存儲過程,名稱為PRODUCT_TEMP_UPDATE_PRC 。
第2~7行表示聲明變量。
第9~11行表示創建游標cur_category;
第13~19行表示創建游標CUR_PROINFO;該游標帶有參數,其參數代表產品類型的編碼。游標根據產品的類型不同,獲取產品類型中價格最低的數據。
第22~25表示判斷臨時表productinfo_tmp是否存在。此處利用select into語句把結果放到變量tabext中,如果該表存在結果為1,否則為0.tabext變量將在第37行使用。
第27行表示為變量pc_delestr賦值,他的值是一條SQL語句,該SQL語句表示刪除表productinfo_tmp中的數據。這種寫法常常用在動態SQL語句上。
第28行表示為變量pc_createstr賦值。他的值是一條DDL語句,該語句用來創建臨時表productinfo_tmp。
第37~44行完成分析步驟中的第一步:創建臨時表productinfo_tmp。首先判斷臨時表是否存在,如果不存在,則創建,如果存在則刪除表中數據。這里使用了execute immediate語句,利用它執行DDL語句及動態語句。
第45~49行表示打開游標cur_category,並進入流循環取值。當游標的%nofound屬性為true時退出。
第50~53行表示打開游標cur_proinfo,它的參數是cur_category中的結果。
第54~58行表示判斷價格是否低於20,如果低於20輸出到屏幕。
第60~69行表示如果非低於20的插入表productinfo_tmp中。
第76行表示將productinfo_tmp表中的數據修改為熱銷產品。
【執行】
SQL>exec PRODUCT_TEMP_UPDATE_PRC ;