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表中乙個欄位來標識這...