1 create or replace procedure product_temp_update_prc as
2 pc_delestr varchar2(50); --刪除臨時表記錄語句
3 pc_createstr varchar2(500); --建立臨時表
4 tabext varchar2(10); --用於判斷臨時表是否存在中間變數
56 cur_ctgy productinfo.category%type;
7 cur_prtifo productinfo%rowtype;
89 cursor cur_category --產品表中的產品型別游標
10 is
11 select category from productinfo group by category;
1213 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;
2021 begin
22 select count(1)
23 into tabext
24 from all_tables
25 where table_name = 『productinfo_tmp』;
2627 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』;
3637 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表中的資料修改為熱銷產品。
儲存過程示例 在儲存過程中使用臨時表
create or replace procedure product temp update prc aspc delestr varchar2 50 刪除臨時表記錄語句 pc createstr varchar2 500 建立臨時表 tabext varchar2 10 用於判斷臨時表是否存在中...
Mysql儲存過程中使用臨時表和游標
1。臨時表 1 drop procedure2if exists p getmonitorpeople 3create procedure p getmonitorpeople in fgid int,in mins int,in lens int 4 begin 5if fgid 0 mins 0...
Oracle儲存過程中使用臨時表的替代方案
近日接手乙個分析類老專案改造工作,使用者要求使用oracle資料庫 原先版本為sql server2005 由於原專案中大量使用儲存過程實現複雜的業務資料查詢,在sql server中由於使用錶值函式 臨時表等非常方便,所以當時實現起來並不費事,而現在轉為oracle就不一樣了,限制太多 說實話 甲...