ORACLE PL/SQ入門
ORACLE PL/SQ入門
六、儲存過程
1.命令格式
儲存過程是一個PL/SQL程式塊,接受零個或多個引數作為輸入(INPUT)或輸出(OUTPUT)、或既作輸入又作輸出(INOUT),與函式不同, 儲存過程沒有返回值,儲存過程不能由SQL語句直接使用,只能通過EXECUT命令或PL/SQL程式塊內部呼叫,定義儲存過程的語法如下:
1.命令格式
儲存過程是一個PL/SQL程式塊,接受零個或多個引數作為輸入(INPUT)或輸出(OUTPUT)、或既作輸入又作輸出(INOUT),與函式不同, 儲存過程沒有返回值,儲存過程不能由SQL語句直接使用,只能通過EXECUT命令或PL/SQL程式塊內部呼叫,定義儲存過程的語法如下:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->PROCEDURE Name [(Parameter[,Parameter,])]
IS|AS
[Local Declarations]
BEGIN
Execute statements;
[EXCEPTION Exception Handlers]
END [Name];
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->PROCEDURE Name [(Parameter[,Parameter,])]
IS|AS
[Local Declarations]
BEGIN
Execute statements;
[EXCEPTION Exception Handlers]
END [Name];
2.呼叫
儲存過程可以直接用EXECUT命令呼叫或PL/SQL程式塊內部呼叫。用EXECUT命令呼叫儲存過程的格式如下:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->SQL>EXCUTE Proc_Name(par1, par2…);
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->SQL>EXCUTE Proc_Name(par1, par2…);
儲存過程也可以被另外的PL/SQL塊呼叫,呼叫的語句是:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->DECLARE par1, par2;
BEGIN
Proc_Name(par1, par2…);
END;
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->DECLARE par1, par2;
BEGIN
Proc_Name(par1, par2…);
END;
3.釋放
當某個儲存過程不再需要時,應將其從記憶體中刪除,以釋放它佔用的記憶體資源。釋放過程的語句格式如下:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->SQL>DROP PROCEDURE Proc_Name;
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->SQL>DROP PROCEDURE Proc_Name;
4.例項:
編寫儲存過程,顯示所指定僱員名所在的部門名和位置。
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->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;
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->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;
呼叫:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->VARIABLE vdname VARCHAR2(14);
VARIABLE vloc VARCHAR2(13);
EXECUTE DeptMesg('SMITH', :vdname£¬ :vloc);
PRINT vdname vloc;
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->VARIABLE vdname VARCHAR2(14);
VARIABLE vloc VARCHAR2(13);
EXECUTE DeptMesg('SMITH', :vdname£¬ :vloc);
PRINT vdname vloc;
七、函式
1.命令格式
函式是命名了的、儲存在資料庫中的PL/SQL程式塊。函式接受零個或多個輸入引數,有一個返回值,返回值的資料型別在建立函式時定義。定義函式的語法如下:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->FUNCTION Name [{Parameter[,Parameter,])]
RETURN DataTypes
IS
[Local Declarations]
BEGIN
Execute Statements;
[EXCEPTION Exception Handlers]
END [Name];
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->FUNCTION Name [{Parameter[,Parameter,])]
RETURN DataTypes
IS
[Local Declarations]
BEGIN
Execute Statements;
[EXCEPTION Exception Handlers]
END [Name];
2.呼叫
無論在命令列還是在程式語句中,函式都可以通過函式名稱直接在表示式中呼叫。例如:將函式Count_Num(‘女’)的返回值賦予變數Man_Num。
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->SQL>EXECUTE Man_Num := Count_Num('女');
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->SQL>EXECUTE Man_Num := Count_Num('女');
3.釋放
當函式不再使用時,要用DROP命令將其從記憶體中刪除,例如:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->SQL>DROP FUNCTION Count_Num;
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->SQL>DROP FUNCTION Count_Num;
4.例項
編寫一個函式以顯示該僱員在此組織中的工作天數。
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->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;
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->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;
八、觸發器
1.觸發器的建立規則:
①作用範圍清晰;
②不要讓觸發器去完成Oracle後臺已經能夠完成的功能;
③限制觸發器程式碼的行數;
④不要建立遞迴的觸發器;
⑤觸發器僅在被觸發語句觸發時進行集中的,全域性的操作,同使用者和資料庫應用無關。
2.可以建立被如下語句所觸發的觸發器:
①DML語句(DELETE,INSERT,UPDATE);
②DDL語句(CREATE,ALTER, DROP);
③資料庫操作(SERVERERROR,LOGON,LOGOFF,STARTUP,SHUTDOWN)。
3.注意事項
①觸發器可以宣告為在對記錄進行操作之前,在之前(檢查約束之前和 INSERT,UPDATE 或 DELETE 執行前)或之後(在檢查約束之後和完成 INSERT, UPDATE 或 DELETE 操作)觸發;
②一個 FOR EACH ROW 執行指定操作的觸發器為操作修改的每一行都呼叫一次;
③SELECT 並不更改任何行,因此不能建立 SELECT 觸發器.這種場合下規則和檢視更適合;
④觸發器和某一指定的表格有關,當該表格備刪除時,任何與該表有關的觸發器同樣會被刪除;
⑤在一個表上的每一個動作只能有一個觸發器與之關聯;
⑥在一個單獨的表上,最多隻能建立三個觸發器與之關聯,一個INSERT觸發器,一個DELETE觸發器和一個UPDATE觸發器;
4.刪除觸發器的語句格式為:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->DROP TRIGGER name ON table;
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->DROP TRIGGER name ON table;
一個觸發器由三部分組成:觸發事件或語句、觸發限制和觸發器動作。觸發事件或語句是指引起激發觸發器的SQL語句,可為對一指定表的INSERT、UNPDATE或DELETE語句。觸發限制是指定一個布林表示式,當觸發器激發時該布林表示式是必須為真。觸發器作為過程,是PL/SQL塊,當觸發語句發出、觸發限制計算為真時該過程被執行。
5.例項
編寫一個資料庫觸發器,當任何時候某個部門從dept表中刪除時,該觸發器將從emp表中刪除該部門的所有僱員。
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->CREATE OR REPLACE TRIGGER del_emp_deptno
BEFORE DELETE ON dept
FOR EACH ROW
BEGIN
DELETE FROM emp WHERE deptno = :OLD.deptno;
END;
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->CREATE OR REPLACE TRIGGER del_emp_deptno
BEFORE DELETE ON dept
FOR EACH ROW
BEGIN
DELETE FROM emp WHERE deptno = :OLD.deptno;
END;
九、包
1.包頭
建立包頭的語句格式如下:
CREATE PACKAGE<包名> IS
變數、常量及資料型別定義;
遊標定義;
函式、過程定義和引數列表及返回型別;
END<包名>;
2.包體
建立包主體部分的語句格式如下:
CREATE PACKAGE BODY<包名>
AS
遊標、函式、過程的具體定義;
END<包名>;
3.例項
包頭程式碼:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->--建立包頭
CREATE PACKAGE test_package IS
--定義變數
man_num NUMBER;
woman_num NUMBER;
--定義遊標
CURSOR學生;
--定義函式
CREATE FUNCTION f_count(in sex IN 學生.sex%TYPE)
--定義返回值型別
RETURN NUMBER;
--定義過程
CREATE PROCEDURE p_count(in_sex IN 學生.sex%TYPE, out_num OUT NUMBER);
--包頭結束
END test_package;
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->--建立包頭
CREATE PACKAGE test_package IS
--定義變數
man_num NUMBER;
woman_num NUMBER;
--定義遊標
CURSOR學生;
--定義函式
CREATE FUNCTION f_count(in sex IN 學生.sex%TYPE)
--定義返回值型別
RETURN NUMBER;
--定義過程
CREATE PROCEDURE p_count(in_sex IN 學生.sex%TYPE, out_num OUT NUMBER);
--包頭結束
END test_package;
包體程式碼:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->--建立包體
CREATE PACKAGE BODY test_package AS
--遊標具體定義
CURSOR 學生IS
SELECT 學號,姓名 FROM 學生 WHERE 學號 < 50;
--函式具體定義
FUNCTION f_count(in_sex IN學生.sex%TYPE)
--定義返回值型別
RETURN NUMBER IS
out_num NUMBER;
--函式體
BEGIN
IF in_sex = '男' THEN
SELECT count(sex) INTO out_num FROM 學生 WHERE性別='男';
ELSE
SELECT count(sex) INTO out_num FROM 學生 WHERE 性別='女';
END IF;
--返回函式值
RETURN(out_num);
--函式定義結束
END f_count;
--過程具體定義
PROCEDURE p_count(in_sex IN學生.sex%TYPE, out_num OUT NUMBER) AS
--過程體
BEGIN
IF in_sex = '男' THEN
SELECT count(sex) INTO out_num FROM 學生 WHERE性別 = '男';
ELSE
SELECT count(sex) INTO out_num FROM 學生 WHERE 性別= '女';
END IF;
--過程定義結束
END P_count;
--包體定義結束
END test_package;
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->--建立包體
CREATE PACKAGE BODY test_package AS
--遊標具體定義
CURSOR 學生IS
SELECT 學號,姓名 FROM 學生 WHERE 學號 < 50;
--函式具體定義
FUNCTION f_count(in_sex IN學生.sex%TYPE)
--定義返回值型別
RETURN NUMBER IS
out_num NUMBER;
--函式體
BEGIN
IF in_sex = '男' THEN
SELECT count(sex) INTO out_num FROM 學生 WHERE性別='男';
ELSE
SELECT count(sex) INTO out_num FROM 學生 WHERE 性別='女';
END IF;
--返回函式值
RETURN(out_num);
--函式定義結束
END f_count;
--過程具體定義
PROCEDURE p_count(in_sex IN學生.sex%TYPE, out_num OUT NUMBER) AS
--過程體
BEGIN
IF in_sex = '男' THEN
SELECT count(sex) INTO out_num FROM 學生 WHERE性別 = '男';
ELSE
SELECT count(sex) INTO out_num FROM 學生 WHERE 性別= '女';
END IF;
--過程定義結束
END P_count;
--包體定義結束
END test_package;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/219982/viewspace-503625/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PL/SQL入門SQL
- PL/SQL基礎語法入門SQL
- 【Oracle】--PL/SQL匯入Oracle sql指令碼"傻瓜教程"OracleSQL指令碼
- Oracle PL/SQLOracleSQL
- 資料庫入門—航空公司模擬(pl/sql)資料庫SQL
- 18Oracle入門Oracle
- 2、oracle入門心得Oracle
- Oracle的入門心得Oracle
- Oracle PL/SQL INDICESOracleSQL
- oracle PL/SQL示例OracleSQL
- Oracle pl/sql 複製表 資料匯入 匯出OracleSQL
- [轉載] Oracle EBS 入門Oracle
- Oracle RAC入門和提高Oracle
- Oracle入門心得(2)(轉)Oracle
- Oracle RMAN快速入門指南Oracle
- ORACLE物化檢視入門Oracle
- oracle基礎入門(轉)Oracle
- oracle rootcrs.pl 用法Oracle
- oracle pl/sql programmingOracleSQL
- enq: SQ - contention" waits in RACENQAI
- Oracle RAC入門和進步Oracle
- Oracle PL/SQL塊簡介OracleSQL
- Oracle PL/SQL中EXCEPTION用法OracleSQLException
- Oracle PL/SQL 之 函式OracleSQL函式
- PL/SQL Developer 連線 OracleSQLDeveloperOracle
- oracle INDEX BY Pl/sql陣列OracleIndexSQL陣列
- 【PL/SQL】oracle建立dblinkSQLOracle
- Oracle PL/SQL之GROUP BY CUBEOracleSQL
- Oracle PL/SQL迴圈示例OracleSQL
- [ADMIN]oracle入門-oracle體系結構Oracle
- Oracle PL/SQL編寫PL/SQL程式碼的注意事項OracleSQL
- 【Oracle】ASM例項安裝入門OracleASM
- Oracle調優(入門及提高篇)Oracle
- Oracle備份與恢復入門Oracle
- Oracle RAC 基本概念及入門Oracle
- Oracle 的PL/SQL語言使用OracleSQL
- PL/Plus本地連線oracle配置Oracle
- Oracle PL/SQL之 Package介紹OracleSQLPackage