SQL在儲存過程中使用臨時表

2021-09-12 15:03:43 字數 3501 閱讀 9436

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就不一樣了,限制太多 說實話 甲...