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















 
 
 

 
 
 
 