存儲過程示例:在存儲過程中使用臨時表


 

 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 ;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM