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

2021-08-05 23:54:51 字數 3405 閱讀 3133

create

or replace procedure

product_temp_update_prc

aspc_delestr

varchar2

(50); --刪除臨時表記錄語句

pc_createstr varchar2(500); --建立臨時表

tabext varchar2(10); --用於判斷臨時表是否存在中間變數

cur_ctgy productinfo.category%type;

cur_prtifo productinfo%rowtype;

cursor cur_category --產品表中的產品型別游標

isselect category from productinfo group

by category;

cursor cur_proinfo(ctgy varchar) is

select *

from (select *

from productinfo

where category = ctgy

order

by productprice asc)

where rownum < 2;

begin

select count(1)

into tabext

from all_tables

where table_name = 'productinfo_tmp';

pc_delestr := 'delete from productinfo_tmp';

pc_createstr := 'create global temporary table productinfo_tmp

(productid varchar2(10) not null,

productname varchar2 (20),

productprice number(8,2),

quantity number(10),

category varchar2(10),

desperaction varchar2(1000),

origin varchar2(10))on commit preserve rows';

if tabext = 0

then

--不存在臨時表就建立乙個

execute immediate pc_createstr;

dbms_output.put_line('建立臨時表成功!');

else

execute immediate pc_delestr;

dbms_output.put_line('刪除記錄完成!');

endif; open cur_category;

loop

fetch cur_category

into cur_ctgy;

exit when cur_category%notfound;

open cur_proinfo(cur_ctgy);

fetch cur_proinfo

into cur_prtifo;

if cur_proinfo%found then

if cur_prtifo.productprice < 20

then

---產品**低於20

dbms_output.put_line('產品id' || cur_prtifo.productid || '產品名稱' ||

cur_prtifo.productname || '產品**' ||

cur_prtifo.productprice);

else

--非低於20**的產品輸入到臨時表productinfo_tmp

execute immediate 'insert into productinfo_tmp(

productid,productname,productprice,quantity,category,desperaction,origin) values

(''' || cur_prtifo.productid || ''',''' ||

cur_prtifo.productname || ''',''' ||

cur_prtifo.productprice || ''',''' ||

cur_prtifo.quantity || ''',''' ||

cur_prtifo.category || ''',''' ||

cur_prtifo.desperaction || ''',''' ||

cur_prtifo.origin || ''')';

endif; end

if; close cur_proinfo;

endloop;

commit;

close cur_category;

execute immediate 'update productinfo_tmp set desperaction = ''熱銷產品''';

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 ;

SqlServer儲存過程中使用事務,示例

create proc pro getprotrans goodsid int,number int,stockprice money,supplierid int,empid int,stockunit varchar 50 stockdate datetime,totalmoney money ...

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

1 create or replace procedure product temp update prc as 2 pc delestr varchar2 50 刪除臨時表記錄語句 3 pc createstr varchar2 500 建立臨時表 4 tabext varchar2 10 用於判...

Oracle儲存過程中使用行鎖的示例

以前對oracle鎖只概念上的一點點了解,沒有認真考慮或使用過。直到在開發過程中遇到了由於沒有使用鎖而導致的併發問題,才對此重視起來。舉個例子來說明我遇到的問題。乙個入庫單錶 t rkd 每一條記錄對應著一條入庫資訊,還有個一對多的關聯表來記錄此入庫單的明細資訊。我使用t rkd表中乙個欄位來標識這...