Oracle存儲過程和自定義函數(shù)
概述
存儲過程和存儲函數(shù)是指存儲在數(shù)據(jù)庫中供所有用戶程序調(diào)用的子程序叫存儲過程、存儲函數(shù)。
異同點:
- 存儲過程和存儲函數(shù)的相同點:完成特定功能的程序。
- 存儲過程和存儲函數(shù)的區(qū)別:是否用return語句返回值。
存儲過程的創(chuàng)建和調(diào)用
***個存儲過程: 打印hello world
- createorreplace procedure sayhelloword
- as
- --說明部分,as一定要寫
- begin
- dbms_output.put_line('Hello World');
- end;
- /
調(diào)用存儲過程
1.execsayhelloworld()
2.2
- -- 調(diào)用兩次
- begin
- sayhelloworld();
- sayhelloworld();
- end;
- /
oracle 帶參數(shù)的存儲過程
- --創(chuàng)建一個帶參數(shù)的存儲過程
- --給指定的員工漲100塊錢的工資,并且打印漲前后漲后的薪水
- createorreplace procedure raisesalary(enoinnumber)--in這是一個輸入?yún)?shù)
- as
- --定義一個變量保存漲前的薪水
- psal emp.sal%type;
- begin
- --得到員工漲前的薪水
- selectsalintopsalfromempwhereempno=eno;
- --給該員工漲100塊錢
- update emp setsal=sal+100whereempno=eno;
- --一般,這里不需要commit!也不需要rollback
- --注意:一般不在存儲過程或者存儲函數(shù)中,commit和rollback
- --打印
- dbms_output.put_line('漲前:'||psal||',漲后:'||(psal+100));
- end;
- /
- --調(diào)用:
- begin
- raisesalary(7839);
- raisesalary(7566);
- end;
- /
如何調(diào)試存儲過程
- 調(diào)試存儲過程***放到Oracle數(shù)據(jù)庫所在的系統(tǒng)或虛擬機上,解壓SQL developer ,雙擊運行。
- 為了確保存儲過程或函數(shù)是可調(diào)試的,右鍵“以編譯并進行調(diào)試”,點擊紅色按鈕“調(diào)試”
- 利用已寫好的調(diào)用函數(shù)進行調(diào)試。
- 給調(diào)試賬戶授權
- grant DEBUG CONNECT SESSION ,DEBUG ANY PROCEDURE to scott;
存儲函數(shù)
函數(shù)的定義
是一個命名的存儲程序,可帶參數(shù),并返回一個計算值。必須有return 子句,用于返回函數(shù)值。
創(chuàng)建存儲函數(shù)語法
- create or replace function 函數(shù)名(參數(shù)列表)
- return 函數(shù)值類型
- as
- begin
- PLSQL子程序體;
- end;
-
注意 表達式中某個字段為空時,表達式返回值為空。為防止含有表達式的返回值錯誤,在可能為空的字段上加上NVL(字段名,0)。
--查詢某個員工的年收入
- --查詢某個員工的年收入
- create or replace function queryemp_income(eno in number)
- return number
- as
- --定義變量接收薪水和獎金
- p_sal emp.sal%type;
- p_comm emp.comm%type;
- begin
- select sal,comm into p_sal,p_comm from emp where empno=eno;
- --nvl為遇空函數(shù),如果p_comm為空則返回0
- return nvl(p_comm,0)+p_sal*12;
- end;
- /
-
out 參數(shù)
存儲過程和存儲函數(shù)都可以有多個輸入(in)和輸出參數(shù)(out),都可以通過out參數(shù)實現(xiàn)返回多個值。
- -- out參數(shù):查詢某個員工姓名、月薪和職位
- -- 原則: 如果只有一個返回值,用存儲函數(shù);否則,就用存儲過程。
- create or replace procedure queryempinfor(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;
- /
-
在 out 參數(shù)中訪問光標
申明包結構
- 包頭(申明)
- 包體(實現(xiàn))
案例
- -- 查詢某個部門中所有員工的所有信息 //ref(reference引用) cursor(光標)
- #包頭
- create or replace package mypackage as
- type empcursor is ref cursor;
- procedure queryEmpList(dno in number,empList out empcursor);
- end mypackage;
- #包體
- create or replace package body mypackage as
- procedure queryEmpList(dno in number,empList out empcursor) as
- begin
- open empList for select * from emp where deptno=dno;
- end queryEmpList;
- end mypackage;
- ***********包體需要實現(xiàn)包頭中聲明的所有方法*********************
-
在應用程序中訪問
在java應用程序中訪問存儲過程和存儲函數(shù)以及訪問包下的存儲過程,可以查看java API文檔。