存儲過程:
1.命令格式
存儲過程是一個PL/SQL程序塊,接受零個或多個參數(shù)作為輸入(INPUT)或輸出(OUTPUT)、或既作輸入又作輸出(INOUT),與函數(shù)不同, 存儲過程沒有返回值,存儲過程不能由SQL語句直接使用,只能通過EXECUT命令或PL/SQL程序塊內(nèi)部調(diào)用,定義存儲過程的語法如下:
PROCEDURE Name [(Parameter[,Parameter,])]
IS|AS
[Local Declarations]
BEGIN
Execute statements;
[EXCEPTION Exception Handlers]
END [Name];
2.調(diào)用
存儲過程可以直接用EXECUT命令調(diào)用或PL/SQL程序塊內(nèi)部調(diào)用。用EXECUT命令調(diào)用存儲過程的格式如下:
SQL>EXCUTE Proc_Name(par1, par2…);
存儲過程也可以被另外的PL/SQL塊調(diào)用,調(diào)用的語句是:
DECLARE par1, par2;
BEGIN
Proc_Name(par1, par2…);
END;
3.釋放
當(dāng)某個存儲過程不再需要時,應(yīng)將其從內(nèi)存中刪除,以釋放它占用的內(nèi)存資源。釋放過程的語句格式如下:
SQL>DROP PROCEDURE Proc_Name;
4.實(shí)例:
編寫存儲過程,顯示所指定雇員名所在的部門名和位置。
CREATE OR REPLACE PROCEDURE DeptMesg(pename emp.ename%TYPE,
pdname OUT dept.dname%TYPE,
ploc OUT dept.loc%TYPE) AS
BEGIN
SELECT dname, loc
INTO pdname, ploc
FROM emp, dept
WHERE emp.deptno = dept.deptno
AND emp.ename = pename;
END;
調(diào)用:
VARIABLE vdname VARCHAR2(14);
VARIABLE vloc VARCHAR2(13);
EXECUTE DeptMesg('SMITH', :vdname£? :vloc);
PRINT vdname vloc;
函數(shù):
1.命令格式
函數(shù)是命名了的、存儲在數(shù)據(jù)庫中的PL/SQL程序塊。函數(shù)接受零個或多個輸入?yún)?shù),有一個返回值,返回值的數(shù)據(jù)類型在創(chuàng)建函數(shù)時定義。定義函數(shù)的語法如下:
FUNCTION Name [{Parameter[,Parameter,])]
RETURN DataTypes
IS
[Local Declarations]
BEGIN
Execute Statements;
[EXCEPTION Exception Handlers]
END [Name];
2.調(diào)用
無論在命令行還是在程序語句中,函數(shù)都可以通過函數(shù)名稱直接在表達(dá)式中調(diào)用。例如:將函數(shù)Count_Num(‘女’)的返回值賦予變量Man_Num。
SQL>EXECUTE Man_Num := Count_Num('女');
3.釋放
當(dāng)函數(shù)不再使用時,要用DROP命令將其從內(nèi)存中刪除,例如:
SQL>DROP FUNCTION Count_Num;
4.實(shí)例
編寫一個函數(shù)以顯示該雇員在此組織中的工作天數(shù)。
CREATE OR REPLACE FUNCTION Hire_Day(no emp.empno%TYPE) RETURN NUMBER AS
vhiredate emp.hiredate%TYPE;
vday NUMBER;
BEGIN
SELECT hiredate INTO vhiredate FROM emp WHERE empno = no;
vday := CEIL(SYSDATE - vhiredate);
RETURN vday;
END;
觸發(fā)器:
1.觸發(fā)器的創(chuàng)建規(guī)則:
①作用范圍清晰;
②不要讓觸發(fā)器去完成Oracle后臺已經(jīng)能夠完成的功能;
③限制觸發(fā)器代碼的行數(shù);
④不要創(chuàng)建遞歸的觸發(fā)器;
⑤觸發(fā)器僅在被觸發(fā)語句觸發(fā)時進(jìn)行集中的,全局的操作,同用戶和數(shù)據(jù)庫應(yīng)用無關(guān)。
2.可以創(chuàng)建被如下語句所觸發(fā)的觸發(fā)器:
①DML語句(DELETE,INSERT,UPDATE);
②DDL語句(CREATE,ALTER, DROP);
③數(shù)據(jù)庫操作(SERVERERROR,LOGON,LOGOFF,STARTUP,SHUTDOWN)。
3.注意事項(xiàng)
①觸發(fā)器可以聲明為在對記錄進(jìn)行操作之前,在之前(檢查約束之前和 INSERT,UPDATE 或 DELETE 執(zhí)行前)或之后(在檢查約束之后和完成 INSERT, UPDATE 或 DELETE 操作)觸發(fā);
②一個 FOR EACH ROW 執(zhí)行指定操作的觸發(fā)器為操作修改的每一行都調(diào)用一次;
③SELECT 并不更改任何行,因此不能創(chuàng)建 SELECT 觸發(fā)器.這種場合下規(guī)則和視圖更適合;
④觸發(fā)器和某一指定的表格有關(guān),當(dāng)該表格備刪除時,任何與該表有關(guān)的觸發(fā)器同樣會被刪除;
⑤在一個表上的每一個動作只能有一個觸發(fā)器與之關(guān)聯(lián);
⑥在一個單獨(dú)的表上,最多只能創(chuàng)建三個觸發(fā)器與之關(guān)聯(lián),一個INSERT觸發(fā)器,一個DELETE觸發(fā)器和一個UPDATE觸發(fā)器;
4.刪除觸發(fā)器的語句格式為:
DROP TRIGGER name ON table;
一個觸發(fā)器由三部分組成:觸發(fā)事件或語句、觸發(fā)限制和觸發(fā)器動作。觸發(fā)事件或語句是指引起激發(fā)觸發(fā)器的SQL語句,可為對一指定表的INSERT、UNPDATE或DELETE語句。觸發(fā)限制是指定一個布爾表達(dá)式,當(dāng)觸發(fā)器激發(fā)時該布爾表達(dá)式是必須為真。觸發(fā)器作為過程,是PL/SQL塊,當(dāng)觸發(fā)語句發(fā)出、觸發(fā)限制計(jì)算為真時該過程被執(zhí)行。
5.實(shí)例
編寫一個數(shù)據(jù)庫觸發(fā)器,當(dāng)任何時候某個部門從dept表中刪除時,該觸發(fā)器將從emp表中刪除該部門的所有雇員。
CREATE OR REPLACE TRIGGER del_emp_deptno
BEFORE DELETE ON dept
FOR EACH ROW
BEGIN
DELETE FROM emp WHERE deptno = :OLD.deptno;
END;
包:
1.包頭
創(chuàng)建包頭的語句格式如下:
CREATE PACKAGE<包名> IS
變量、常量及數(shù)據(jù)類型定義;
游標(biāo)定義;
函數(shù)、過程定義和參數(shù)列表及返回類型;
END<包名>;
2.包體
創(chuàng)建包主體部分的語句格式如下:
CREATE PACKAGE BODY<包名>
AS
游標(biāo)、函數(shù)、過程的具體定義;
END<包名>;
3.實(shí)例
包頭代碼:
包體代碼:
--創(chuàng)建包頭
CREATE PACKAGE test_package IS
--定義變量
man_num NUMBER;
woman_num NUMBER;
--定義游標(biāo)
CURSOR學(xué)生;
--定義函數(shù)
CREATE FUNCTION f_count(in sex IN 學(xué)生.sex%TYPE)
--定義返回值類型
RETURN NUMBER;
--定義過程
CREATE PROCEDURE p_count(in_sex IN 學(xué)生.sex%TYPE, out_num OUT NUMBER);
--包頭結(jié)束
END test_package;
--創(chuàng)建包體
CREATE PACKAGE BODY test_package AS
--游標(biāo)具體定義
CURSOR 學(xué)生IS
SELECT 學(xué)號,姓名 FROM 學(xué)生 WHERE 學(xué)號 < 50;
--函數(shù)具體定義
FUNCTION f_count(in_sex IN學(xué)生.sex%TYPE)
--定義返回值類型
RETURN NUMBER IS
out_num NUMBER;
--函數(shù)體
BEGIN
IF in_sex = '男' THEN
SELECT count(sex) INTO out_num FROM 學(xué)生 WHERE性別='男';
ELSE
SELECT count(sex) INTO out_num FROM 學(xué)生 WHERE 性別='女';
END IF;
--返回函數(shù)值
RETURN(out_num);
--函數(shù)定義結(jié)束
END f_count;
--過程具體定義
PROCEDURE p_count(in_sex IN學(xué)生.sex%TYPE, out_num OUT NUMBER) AS
--過程體
BEGIN
IF in_sex = '男' THEN
SELECT count(sex) INTO out_num FROM 學(xué)生 WHERE性別 = '男';
ELSE
SELECT count(sex) INTO out_num FROM 學(xué)生 WHERE 性別= '女';
END IF;
--過程定義結(jié)束
END P_count;
--包體定義結(jié)束
END test_package;