儲存過程
建立儲存過程
create procedure test
asbegin
dbms_output.put_line('我的第乙個過程!');
end;
--執行
--serveroutput設定,想讓dbms_output.put_line成功輸出,需要把serveroutput選項設定為on的狀態
show serveroutput
set serveroutput on
begin
test;
end;
檢視儲存過程
select * from user_source where name= 'test' order by line ;
--從檢視user_source中查詢過程或函式時需要把名稱大寫
--檢視儲存過程test_err的錯誤
show errors procedure test_err;
無參儲存過程
無參儲存過程就是建立的儲存過程不帶任何引數,通常這種儲存過程用做資料轉換的機率比較大。
--把錶productinfo中**最低的3件產品的desperation欄位設定為』**商品『
create procedure product_update_prc
asbegin
update productinfo set desperation = '**產品'
where productid in
( select productid from
( select * from productinfo order by productprice asc )
where rownum < 4
);commit;
end;
儲存過程中使用游標
--要求把productinfo表中資料根據不同的產品型別分類把資料輸出到螢幕
create procedure product_cur_prc
ascur_ctgy productinfo.category%type;
cur_ctgyname categroyinfo.categroyname%type;
cur_prtifo productinfo%rowtype;
cursor cur_category
is select category from productinfo group by category;
begin
open cur_category;
loop
fetch cur_category;
exit when cur_category%notfound;
select categoryinfo.categroyname into cur_ctgyname
from categroyinfo
where categroyid = cur_ctgy;
if sql%found then
dbms_output.put_line('---------------');
dbms_output.put_line(cur_ctgyname || ':');
end if;
for my_prdinfo_rec in
(select * from productinfo where category = cur_ctgy
)loop
dbms_output.put_line(
'產品名稱: ' || my_prdinfo_rec.productname|| '產品**: ' || my_prdinfo_rec.productprice|| '產品數量:' || my_prdinfo_rec.quantity
);end loop;
end loop;
close cur_category;
end ;
儲存過程中的ddl語句
有時候我們會在運算元據的時候使用臨時表,而為了讓儲存過程根據有通用性,可以選擇把建立臨時表的步驟一併放到過程裡。這樣的操作會和前面介紹的兩種示例寫法有所不同,它會用到execute immediate語句,儲存過程中會使用它來執行ddl語句和動態sql語句
--要求把各種不同型別的產品中**最低的輸入到臨時表productinfo_tmp(此表需要建立)中,並在其中desperation欄位註明「熱銷商品「,如果記錄中**低於20則表示資料有問題,需要輸出到螢幕
create procedure product_tmep_update_prc
aspc_delestr varchar2(50);
pc_createstr varchar2(500);
pc_insrtstr varchar2(500);
tabext varchar2(10); --判斷臨時表是否存在中間變數
cur_ctgy productinfo.category%type;
cur_prtifo productinfo%rowtype;
cursor cur_category
isselect category from prodictinfo group by category;
cursor cur_proinfo(ctgy varchar)
isselect * 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:= 'delecte 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),
desperation varchar2(1000),
origin barchar2(10)
)on commit preserve rows';
if tabext=0 then --不存在就建立乙個
execute immediate pc_createrstr;
dbms_output.put_line('建立臨時表成功');
else
execute immediate pc_delestr;
dbms_output.put_line('刪除記錄完成');
end if;
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**的產品輸入到臨時表
execute immediate 'insert into productinfo_tmp(productid,productname.productprice,quantity,category,desperation,origin) values (...||cur_prtifo.productid||...,...||cur_prtifo.productname||...,...||cur_prtifo.productpruce||...,...||cur_prtifo.quantity||...,...||cur_prtifo.category||...,...||cur_prtifo.desperation||...,...||cur_prtifo.origin||...)';
end if;
end if;
close cur_proinfo;
end loop;
commit;
close cur_category;
execute immediate 'update productinfo_tmp set desperation = ''熱銷商品''',
end;
Oracle資料庫儲存過程
建立語句 create or replace procedure 儲存過程名 儲存過程名定義 包括儲存過程名和引數列表。引數名和引數型別。引數名不能重複,引數傳遞方式 in,out,in out in 表示輸入引數,按值傳遞方式。out 表示輸出引數,可以理解為按引用傳遞方式。可以作為儲存過程的輸出...
oracle資料庫 儲存過程
儲存過程 stored procedure 是一組為了完成特定功能的sql 語句集,經編譯後儲存在資料庫中。使用者通過指定儲存過程的名字並給出引數 如果該儲存過程帶有引數 來執行它。儲存過程是資料庫中的乙個重要物件,任何乙個設計良好的資料庫應用程式都應該用到儲存過程。儲存過程是由流控制和sql 語句...
匯出oracle資料庫儲存過程
專案結束了,想把自己寫的儲存過程匯出儲存乙份就寫了這麼乙個簡單的指令碼,拿出來給大家共享一下。其實很簡單,主要用到user procedures user source兩個檢視,大家一看就知道了。好像網上搜到的一些都不夠全面,而且零零散散,如果覺得好的話就支援一下吧,usr bin ksh prof...