oralce中存儲過程
oralce中存儲過程【薦】
在oracle中自定義存儲過程處理業(yè)務(wù)關(guān)系,完成1個活n個較為復(fù)雜的業(yè)務(wù)功能
例如:銀行轉(zhuǎn)賬業(yè)務(wù)
1.創(chuàng)建存儲過程語法
create procedure 自定義存儲過程名稱(
????????參數(shù)名[in/out/in out] 參數(shù)類型
????????...
????????參數(shù)名[in/out/in out] 參數(shù)類型
)
as
...聲明區(qū)...
begin
...編輯區(qū)...
end;
單詞:procedure 過程
練習(xí):定義存儲過程完成部門注冊
drop procedure pro_sacedept;
create procedure pro_sacedept(
????????v_no dept.deptNO%type,
????????v_name dept.dName%type
????????v_loc dept.loc%type
)
as
begin
????????insert into dept(deptNO,dename,loc)values(v_no,v_name,v_loc);
????????commit;
end;
/
調(diào)用方式1:
begin????
????????pro_savedept(70,'墩部','倫敦');
end;
調(diào)用方式2:
exec pro_savedept(71,'盧部','戰(zhàn)斗');
2.存儲過程相關(guān)參數(shù)修飾符:in,out,in out
in 表示此參數(shù)是輸入?yún)?shù),只進(jìn)不出(此修飾符修飾的參數(shù),值在過程內(nèi)不可二次變,只能通過調(diào)用時的實參賦值)
out 表示此參數(shù)是輸出參數(shù),可進(jìn)可出(值可改變,并且會同期改變調(diào)用時傳遞的變量值)
練習(xí)對In修飾符號的錯誤賦值演示:
drop procedure pro01;
create procedure pro01(
? ? v_a in number
)
as
begin
? ? ? ? v_a:=666;
end;
/?
警告: 創(chuàng)建的過程帶有編譯錯誤。
此時過程創(chuàng)建具有編譯錯誤,因為v_a這個參數(shù)用in修飾過,值不可改變。
-----------------------------------------------------------------
練習(xí)in參數(shù)的正確賦值傳遞
drop procedure pro02;
create procedure pro02(
v_a in number
)
as
begin
dbms_output.put_line('過程內(nèi)a的值是:'||v_a);
end;
/
可調(diào)用時賦值:
exec pro02(10);
-----------------------------------------------------------------
練習(xí)out參數(shù)的正確傳遞
drop procedure pro03;
create procedure pro03(
v_a out number,
v_b out number
)
as
begin
v_a:=1+2;
v_b:=1-2;
end;
/
out參數(shù)的實參傳值
declare
v_x number;
v_y number;
begin
pro03(v_x,v_y);
dbms_output.put_line('x值:'||v_x);
dbms_output.put_line('y值:'||v_y);
end;
練習(xí),2個數(shù)找最大值
drop procedure pro04;
create procedure pro04(
v_a in number,
v_b in number,
v_max out number,?
v_sum out number
)
as
begin
if v_a>=v_b then
v_max:=v_a;
else
v_max:=v_b;
end if;
v_sum:=v_a+v_b;
end;
調(diào)用過程找出v_x和v_y中的最大值
declare
v_x number:=10;
v_y number:=20;
? v_max1 number:=0;
? v_sum1 number:=0;
begin
pro04(v_x,v_y,v_max1,v_sum1);
dbms_output.put_line(v_x||'與'||v_y||'中最大值是:'||v_max1);
dbms_output.put_line(v_x||'與'||v_y||'相加和是:'||v_sum1);
end;
練習(xí)存儲過程完成轉(zhuǎn)賬業(yè)務(wù)
/*利用存儲過程實現(xiàn)轉(zhuǎn)賬:貂蟬轉(zhuǎn)張飛1000塊錢...*/
insert into emp(empNo,eName,sal) values(2001,'張飛',800);
insert into emp(empNo,ename,sal) values(2002,'貂蟬',1888);
commit;?
drop procedure proSal;
create procedure proSal(
v_nameFrom emp.ename%type,
v_nameTo emp.ename%type,
v_money emp.sal%type
)
as
v_sal emp.sal%type;
begin
select sal into v_sal from emp where eName=v_nameFrom;
if v_sal > v_money then
update emp set sal=sal-v_money where ename=v_nameFrom;
update emp set sal=sal+v_money where ename=v_nameTo;
commit;
dbms_output.put_line(v_nameFrom||'向'||v_nameTo||'轉(zhuǎn)賬成功!');
else
dbms_output.put_line(v_nameFrom||'余額不足,向'||v_nameTo||'轉(zhuǎn)賬失??!');
end if;
end;
exec proSal('貂蟬','張飛',1000);