1、存儲過程和存儲函數
描述:指存儲在數據庫中供所有用戶程序調用的子程序叫做存儲過程、存儲函數
區別:存儲函數可以通過return子句返回一個函數的值
(1)存儲過程
語法:create [or replace] PROCEDURE 過程名(參數列表)
AS
PLSQL子程序體;
存儲過程的調用方式:
a)exec/execute 過程名();
b)begin
過程名();
過程名();
end;
/
帶參數的存儲過程:
舉例:為指定的員工漲100塊錢工資,並且打印漲前以及漲后的工資。
在sql developer中創建帶參數的存儲過程:
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和rollback。 --打印 DBMS_OUTPUT.PUT_LINE('漲前:'||psal||'漲后:'||(psal+100)); end; /
使用sql developer調試調用plsql程序:
如果缺少權限,可以使用數據庫超管賦予當前用戶權限:
(2)存儲函數
語法:
create [or replace] FUNCTION 函數名(參數列表)
return 函數值類型
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; /
調試過程類似調試存儲過程的步驟!
2、使用存儲過程和使用存儲函數的一條簡單非必要原則:如果只有一個返回值,使用存儲函數的return子句返回;如果有多個返回值,則使用存儲過程通過out參數返回。
create or replace PROCEDURE queryempinform(eno in number, pename out varchar2, psal out number, pjob out varchar2) as begin --得到員工的姓名、月薪、職位 select ename,sal,job into pename,psal,pjob from emp where empno=eno; end;
問題思考:
a)如果查詢某人的所有字段信息(並且字段比較多),該如何解決?
b)如何返回多條符合條件的結果集,out參數可以返回結果集嗎?