區別:存儲過程沒有返回值, 存儲函數有返回值(他們都可以通過out參數輸出返回值,所以這句話到后邊就不太對了)
存儲過程和存儲函數現在已經是一回事了,只是老版本的數據庫里兩者有區分,為了兼容老版本所以還分開稱呼
一,存儲過程
1,打印Hello World:沒有參數的存儲過程,名字后不帶()
create or replace procedure sayhello as begin dbms_output.put_line('Hello!'); end;
2,帶參數的存儲過程,不commit事物,水調用誰commit (in:輸入參數,out 輸出參數)
create or replace procedure raiseSalary(eno in number) as --變量 psal emp2.sal%type; begin --得到漲薪前的工資 select sal into psal from emp2 where empno=eno; --漲工資 update emp2 set sal=sal+100 where empno=eno; --此處不用commit ,誰調用誰commit --打印 dbms_output.put_line('漲工資前薪水:'||psal||',漲工資后薪水:'||(psal+100)); end;
調用時候提交事物 commit
二、存儲函數
例子一:查詢某個員工的年薪
create or replace function queryEmpImcome(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+nvl(pcomm,0))*12; end;
過程和函數中的in 、out 參數
所以現在意義上,過程和函數就是一回事
例子:查詢某個員工的姓名、薪水、工種, 使用存儲過程實現
/* 查詢某個員工的姓名,薪水,職位 */ create or replace procedure queryEmpInfo(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;
plsql測試:
選擇存儲過程、還是存儲函數?