存儲過程、函數、觸發器
存儲過程
實質性特定任務的子程序
優點
1、模塊化
2、可重用性
3、可維護性
4、安全性
創建語法
CREATE [OR REPLACE] PROCEDURE 過程名稱
[(參數列表)]
{IS|AS}
[聲明變量]
BEGIN
--執行語句
[EXCEPTION]
--異常處理語句
END [過程名稱]
//===============================================
CREATE OR REPLACE PROCEDURE find_emp
(emp_no NUMBER)
AS
empname VARCHER2(20)
BEGIN
--執行語句
[EXCEPTION]
--異常處理語句
END find_emp ;
使用儲存過程
EXECUTE 過程名稱 (參數列表);
存成過程參數模式
IN 輸入模式(模式)
OUT 輸出模式
IN OUT 輸入輸出模式
1、IN是默認模式
2、OUT、IN OUT模式在返回到調用環境前賦值
3、在參數列表中不能給OUT、IN OUT賦值
存儲過程的授權
執行權、調試權
只授權
GRANT EXECUTE ON 過程名 TO 用戶名
授權並授權授權的權限
GRANT EXECUTE ON 過程名 TO 用戶名 WITH GRANT OPTION
程序塊的跟蹤和調試
PL/SQL developor環境下
SHOW ERREORS 查看某個程序塊是否有錯誤
語法SHOW ERREORS [程序塊的類型,名稱]
類型:FUNCTION | PROCEDURE | PACKEAGE | PACKAGE BODY | TRIGGER | VIEW | TYPE | TYPE BODY | DIMENSION | JAVA SOURCE |JAVA CLASS}
developor環境下的調試
調試窗口
FILE——NEW——TEST WINDOE
窗口頁簽
Test script 測試代碼
DSMS OutPut 打印輸出
statistics 統計表
窗口圖表
第一個: 調試
第二個: 執行
第三四個: 單步調試
第五六個: 跳出
調試步驟
1、設置斷點
2、寫入測試代碼
3、輸入想顯示的變量,查看值
4、按執行或逐步進入斷點處
自主事務
自主事務是由另一個事務處理啟動的獨立的事務處理。
解決問題
在調用存儲過程時,一個過程的更改對這兩個
過程都可見,任何提交或回退都會影響這兩個
標記為自主事務
在CREATE之中,寫入編譯指使PRACMA AUTONOMOUS_TRANSACTION;
函數
用於返回特定數據的PL/SQL程序塊,必須有一個返回值
創建語法
CREATE [OR REPLACE] FUNCTION 函數名稱
[(參數列表)]
RETURN datatype
IS|AS
BEGIN
語句塊(必須含有RERTUN)
END;
//===================實例======================
CREATE OR REPLACE FUNCTION 函數名稱
RERTUN VARCHAR2
IS
BEGIN
RETURN 'asd'
END;
調用語法
無參的:直接用函數名
有參數:函數名(參數列表)
與過程的區別
存儲過程 函數
調用 作為PLSQL語句執行 作為表達是一部分
RETURN 不包含,有也不用於 必須包含
返回
程序包
是一種數據庫對象,是對相關PL/SQL、子程序、游標、異常
變量、常量等的封裝
構成
程序包規范 聲明PL/SQL、子程序、游標、異常
變量、常量
程序包主體 實現規范中定義的PL/SQL、子程序、游標、異常
變量、常量
程序包規范
應用程序的接口
創建語法
CREATE [OR REPLACE] PACKAGE 包名
IS | AS
[聲明公共類型、常量、變量、異常、游標等]
[聲明PLSQL子程序]
END 包名;
//==================實例================
CREATE OR REPLACE PACKAGE 包名
IS
PROCEDURE emp_proc();
FUNCTION emp_fun () RETURN VARCHER2;
[聲明PLSQL子程序]
END 包名;
程序包主體
包含規范中每一個的實現
CREATE [OR REPLACE] PACKAGE BODY 包名
IS | AS
[聲明常量、變量、異常、游標等]
[聲明PLSQL子程序]
[BEGIN
初始化代碼]
END 包名;
//===================實例===============
CREATE OR REPLACE PACKAGE BODY 包名
AS
PROCEDURE emp_proc() IS
--過程
END emp_proc
FUNCTION emp_fun() RETURN VARCHER2 IS
--函數
END emp_fun;
END 包名;
觸發器
當特定事物出現時,自動執行的代碼塊
功能:
限制對表的修改
自動生成派生列
強制數據一致
強制復雜的完整性約束條件
提供審計和日志功能
防止無效的事務邏輯
啟用復雜的業務邏輯
語法
CREATE [OR REPLACE] TRIGGER 觸發器名
--以上表示之前、之後、代替原操作
{BEFORE | AFTER | INSREAD OF}
--指定構成觸發器的數據庫操作類型,UPDATE可以指定列
{INSERT | DELETE | UPDATE [OF 修改的列的列表]}
[OR {INSERT | DELETE | UPDATE [OF column[, column]]}]
--創建觸發器的表或視圖
ON [schema.]
--指定新行和舊行的其他名稱,默認NEW和OLD
[PEFERENCINC [NEW AS new_row_name] [OLD AS old_row_name] ]
--是否對每行執行觸發
[FOR EACH ROW]
--限制執行條件
[WHEN (condition)]
[DECLARE
定義]
BEGIN
PLSQL塊
[EXCEPTION
異常處理]
END 觸發器名
//==============實例======================
CREATE OR REPLACE TRIGGER 觸發器名
BEFORE
INSERT OR UPDATE OF position
ON 表名
FOR EACH ROW
WHEN ( New.positon <> 5 )
BEGIN
PLSQL塊
END 觸發器名
分析
觸發器語句
是可以導致觸發器發生的事件
INSERT OR UPDATE OF position
ON 表名
FOR EACH ROW
觸發器限制
當條件值為真才運行觸發器
WHEN ( New.positon <> 5 )
觸發器操作
觸發器中的SQL語句和代碼
BEGIN
PLSQL塊
END 過程名
類型
行級觸發器
對DML語句影響的每一行都執行一次
使用: [FOR EACH ROW]字句
可以使用OLD和NEW訪問修改先後的數據
語句級觸發器
對每個DML語句執行一次
使用: 是默認類型
INSTEAD OF觸發器
在視圖上創建的觸發器
用於替換所使用的實際語句的觸發器
模式觸發器
用戶事件觸發器
DDL語句的觸發器
數據庫觸發器
創建在數據庫上的觸發器
狀態
DISABLED 非啟用狀態
ENABLED 啟用狀態
改變方式
ALTER TRIGGER 觸發器名 {ENABLE | DISABLE}
刪除觸發器
DROP TRIGGER 觸發器名稱
查看
用戶字典視圖
DESC USER_TRIGGERS