1.存儲過程
將一段已經(jīng)編譯好的代碼,封裝到數(shù)據(jù)庫中
1. 作用 :
提高了代碼的復(fù)用性
因?yàn)橐约熬幾g好了,可以提高了執(zhí)行效率
關(guān)鍵字 - procedure /pr?’si?d??/ 過程,程序,手續(xù)
2. 語法:
create [or replace] procedure
? ? 過程名稱(參數(shù)1 in|out 參數(shù)類型,參數(shù)2 in|out 參數(shù)類型)
? is | as
? ? -- 聲明
? begin
? ? -- 業(yè)務(wù)
? end;
調(diào)用方法:
? ? 一: call 過程名稱(參數(shù));
? ? 二: plsql中使用:
? ? ? ? begin
? ? ? ? ? ? 過程名稱(參數(shù));
? ? ? ? end;? ?
1.輸入?yún)?shù)
定義一個存儲過程,給員工編號為7369的員工漲1000工資
代碼實(shí)現(xiàn):
create or replace procedure
? update_sal(vempno in number,vcount in number)
is
? -- 聲明變量記錄當(dāng)前工資
? cur_sal number;
begin
? -- 先查詢漲工資前的工資
? select sal into cur_sal from emp where empno = vempno;
? dbms_output.put_line('漲工資前: '||cur_sal);
? -- 更新工資
? update emp set sal = sal + vcount where empno = vempno;
? -- 漲工資后的工資
? dbms_output.put_line('漲工資后: '||(cur_sal+vcount));
? commit;
end;
調(diào)用:
call update_sal(7369,1000);
或
begin
? ? update_sal(7369,1000);
end;
2.輸出參數(shù)
根據(jù)員工編號,得到年薪
create or replace procedure
? year_sal(vempno in number,vyearsal out number)
as
begin
? select sal*12 + nvl(comm,0) into vyearsal --nvl(a,b) 如果a為null,則取b
? ? from emp where empno = vempno;
end;
調(diào)用:
declare
? yearsal number;
begin
? year_sal(7369,yearsal);
? dbms_output.put_line(yearsal);
end;?
3.輸出的是游標(biāo)類型:
游標(biāo)的類型是sys_refcursor
打開游標(biāo)并獲取數(shù)據(jù)一步合成:
open 游標(biāo)名 for 查詢語句
定義游標(biāo):
create or replace procedure
? findall_cursor(vcursor out sys_refcursor)
is
begin
? --打開游標(biāo),指定結(jié)果集
? open vcursor for select * from emp;
end;
emp%rowtype 指的是emp的行類型
%type可以使變量獲得與字段相同的數(shù)據(jù)類型
調(diào)用
declare
? yb sys_refcursor;
? -- 定義一個vrow變量膳叨,類型是emp的行類型
? vrow emp%rowtype;
begin
? findall_cursor(yb);
? loop
? ? ? fetch yb into vrow;
? ? ? exit when yb%notfound;
? ? ? dbms_output.put_line('編號:'||vrow.empno||' 姓名:'||vrow.ename);
? end loop;
? -- 關(guān)閉游標(biāo)
? close yb;
end;
2.存儲函數(shù)
實(shí)質(zhì)是跟存儲過程一樣
和存儲過程的區(qū)別:
函數(shù)有返回值,過程沒有,函數(shù)的返回值可以用:=接收
函數(shù)可以直接在sql中調(diào)用,過程不能
函數(shù)和過程都實(shí)現(xiàn)對方的功能.
語法:
create [or replace] function
? ? 函數(shù)名稱(參數(shù)1? 參數(shù)類型) return 返回類型
? is
? ? 返回變量 變量類型
? begin
? ? ...
? ? return 返回變量
? end;
定義一個存儲函數(shù),根據(jù)員工編號計(jì)算一個月的納稅,稅率15%
代碼:
create or replace function
? fun_getTax(vempno number) return number
is
? vtax number;
begin
? select sal*0.15 into vtax from emp where empno = vempno;
? return vtax;
end;?
調(diào)用:
declare
? vtax number;
begin
? vtax := fun_getTax(7369);
? dbms_output.put_line(vtax);
end;