存儲過程和存儲函數(shù)
一棉姐、概念:
指存儲在數(shù)據(jù)庫中供所有用戶程序調(diào)用的子程序叫存儲過程肛搬、存儲函數(shù)岸啡。
存儲過程和存儲函數(shù)區(qū)別:
相同點:都是完成特定功能的子程序
不同點:存儲函數(shù)可以通過return語句返回一個函數(shù)的值,而存儲過程則不可以抚恒。
二、創(chuàng)建存儲過程:
用create procedure命令建立存儲錯過程
語法:
create [or replace] procedure 過程名(參數(shù)列表)
as
plsql子程序體;
例:
打印Hello World:
create or replace procedure sayHelloWorld
as
--說明部分
begin
dbms_output.put_line('Hello World');
end;
三络拌、存儲過程調(diào)用
調(diào)用存儲過程:兩種方式:
1.exec sayHelloWorld();
2.begin
sayHelloWorld();
sayHelloWorld();
end;
帶參數(shù)的:輸入?yún)?shù)用in俭驮,輸出參數(shù)用out
--給指定的員工漲100,并且打印漲前和漲后的薪水
create or replace procedure raisesalary(eno in number)
as
--定義變量保存漲前的薪水
psal emp.sal%type;
begin
--得到漲前的薪水
select sal into psal from emp where empno=eno;
--漲100
update emp set sal=sal+100 where empno=eno;
--要不要commit春贸?不要混萝,應(yīng)由調(diào)用該存儲函數(shù)的語句來提交,保證在同一個事務(wù)中萍恕。
dbms_output.put_line('漲前:'||psal||' 漲后:'||(psal+100));
end;
調(diào)用:
begin
raisesalary(7839);
raisesalary(7566);
commit;
四逸嘀、存儲函數(shù)
函數(shù)為一命名的存儲程序,可帶參數(shù)允粤,并返回一計算值崭倘。函數(shù)和過程的結(jié)構(gòu)類似,但必須有一個return子句类垫,用于返回函數(shù)值司光。函數(shù)說明要指定函數(shù)名、結(jié)果值得類型悉患,以及參數(shù)類型等残家。
建立存儲函數(shù)的語法:
create [or replace] function 函數(shù)名(參數(shù)列表)
return 函數(shù)值類型
as
plsql子程序體;
例:
--查詢某個員工的年收入
create or replace function queryempincome(eno in number)
return number
as
--定義變量保存月薪和獎金
psal emp.sal%type;
pcomm emp.comm%type;
begin
select sal,comm into psal,pcomm from emp where empno=eno;
--返回年收入
return psal*12+nvl(pcomm,0);
end;
過程和函數(shù)中的in和out
一般來講,過程和函數(shù)的區(qū)別在于函數(shù)可以有一個返回值售躁;而過程沒有返回值坞淮。
但過程和函數(shù)都可以通過out指定一個或多個輸出參數(shù)。我們可以利用out參數(shù)陪捷,在過程和函數(shù)中實現(xiàn)返回多個值回窘。
原則:如果只有一個返回值,用存儲函數(shù)揩局;否則毫玖,用存儲過程。
查詢某個員工的姓名 月薪 職位:
create or replace procedure queryempinfo(eno in number,
pename out varchar2,
psal out number,
pjob out varchar2)
as
begin
select ename,sal,empjob into pename,psal,pjob from emp where empno=eno;
end;
問題:
1.查詢某個員工的所有信息 ---> out參數(shù)太多
2.查詢某個部門中的所有員工信息 ---> 返回集合