PL/SQL程序塊可背獨立編譯並存儲在數據庫中,任何與數據庫相鏈接的應用程序均可以訪問這些存儲的PL/SQL程序塊。ORACLE提供了四種類型的可存儲的程序: 數據庫
過程和函數
過程和函數都以編譯後的形式存放在數據庫中,函數能夠沒有參數也能夠有多個參數並有一個返回值。過程有零個或多個參數,沒有返回值。函數和過程均可以經過參數列表接收或返回零個或多個值,函數和過程的主要區別不在於返回值,而在於他們的調用方式。過程是做爲一個獨立執行語句調用的:
pay_involume(invoice_nbr,30,due_date);
函數以合法的表達式的方式調用:
order_volumn:=open_orders(SYSDATE,30);
建立過程的語法以下:
服務器
CREATE [ OR REPLACE] PROCEDURE [schema.]procedure_name [parameter_lister] {AS|IS} declaration_section BEGIN executable_section [EXCEPTION exception_section] END [procedure_name] |
每一個參數的語法以下:
paramter_name mode datatype [(:=|DEFAULT) value]
mode有三種形式:IN、OUT、INOUT。
IN表示在調用過程的時候,實際參數的取值被傳遞給該過程,形式參數被認爲是隻讀的,當過程結束時,控制會返回控制環境,實際參數的值不會改變。
OUT在調用過程時實際參數的取值都將被忽略,在過程內部形式參數只能是被賦值,而不能從中讀取數據,在過程結束後形式參數的內容將被賦予實際參數。
INOUT這種模式是IN和OUT的組合;在過程內部實際參數的值會傳遞給形式參數,形勢參數的值可讀也可寫,過程結束後,形勢參數的值將賦予實際參數。
建立函數的語法和過程的語法基本相同,惟一的區別在於函數有RETUREN子句
數據結構
CREATE [ OR REPLACE] FINCTION [schema.]function_name [parameter_list] RETURN returning_datatype {AS|IS} declaration_section BEGIN executable_section [EXCEPTION] exception_section END [procedure_name] |
在執行部分函數必須有喲個或多個return語句。
在建立函數中能夠調用單行函數和組函數,例如:
函數
CREATE OR REPLACE FUNCTION my_sin(DegreesIn IN NUMBER) RETURN NUMBER IS pi NUMBER=ACOS(-1); RadiansPerDegree NUMBER; BEGIN RadiansPerDegree=pi/180; RETURN(SIN(DegreesIn*RadiansPerDegree)); END |
包
包是一種將過程、函數和數據結構捆綁在一塊兒的容器;包由兩個部分組成:外部可視包規範,包括函數頭,過程頭,和外部可視數據結構;另外一部分是包主體(package body),包主體包含了全部被捆綁的過程和函數的聲明、執行、異常處理部分。
打包的PL/SQL程序和沒有打包的有很大的差別,包數據在用戶的整個會話期間都一直存在,當用戶得到包的執行受權時,就等於得到包規範中的全部程序和數據結構的權限。但不能只對包中的某一個函數或過程進行受權。包能夠重載過程和函數,在包內能夠用同一個名字聲明多個程序,在運行時根據參數的數目和數據類型調用正確的程序。
建立包必須首先建立包規範,建立包規範的語法以下:
spa
CREATE [OR REPLACE] PACKAGE package_name {AS|IS} public_variable_declarations | public_type_declarations | public_exception_declarations | public_cursor_declarations | function_declarations | procedure_specifications END [package_name] |
建立包主體使用CREATE PACKAGE BODY語句:
對象
CREATE [OR REPLACE] PACKAGE BODY package_name {AS|IS} private_variable_declarations | private_type_declarations | private_exception_declarations | private_cursor_declarations | function_declarations | procedure_specifications END [package_name] |
私有數據結構是那些在包主體內部,對被調用程序而言是不可見的。
觸發器(Triggers)
觸發器是一種自動執行響應數據庫變化的程序。能夠設置爲在觸發器事件以前或以後觸發或執行。可以觸發觸發器事件的事件包括下面幾種:
DML事件
DDL事件
數據庫事件
DML事件觸發器能夠是語句或行級觸發器。DML語句觸發器在觸發語句以前或以後觸發DML行級觸發器在語句影響的行變化以前或以後觸發。用戶能夠給單一事件和類型定義多個觸發器,但沒有任何方法能夠加強多觸發器觸發的命令。下表列出了用戶能夠利用的觸發器事件:
事件
事件 | 觸發器描述 |
INSERT | 當向表或視圖插入一行時觸發觸發器 |
UPDATE | 更新表或視圖中的某一行時觸發觸發器 |
DELETE | 從表或視圖中刪除某一行時觸發觸發器 |
CREATE | 當使用CREATE語句爲數據庫或項目增長一個對象時觸發觸發器 |
ALTER | 當使用ALTER語句爲更改一個數據庫或項目的對象時觸發觸發器 |
DROP | 當使用DROP語句刪除一個數據庫或項目的對象時觸發觸發器 |
START | 打開數據庫時觸發觸發器,在事件後觸發 |
SHUTDOWN | 關閉數據庫時觸發,事件前觸發 |
LOGON | 當一個會話創建時觸發,事件前觸發 |
LOGOFF | 當關閉會話時觸發,事件前觸發 |
SERVER | 服務器錯誤發生時觸發觸發器,事件後觸發 |
建立觸發器的語法以下:
ci
CREATE [OR REPLACE] TRIGGER trigger_name {before|after|instead of} event ON {table_or_view_name|DATABASE} [FOR EACH ROW[WHEN condition]] trigger_body |
只有DML觸發器(INSERT、UPDATE、DELETE)語句可使用INSTEAD OF觸發器而且只有表的DML觸發器能夠是BEFORE或AFTER觸發器。
象約束同樣觸發器能夠被設置爲禁用或啓用來關閉或打開他們的執行體(EXECUTE),將觸發器設置爲禁用或啓用使用ALTER TRIGGER語句:
it
ALTER TRIGGER trigger_name ENABLE; ALTER TRIGGER trigger_name DISABLE; |
要禁用或啓用表的全部觸發器,使用ALTER TABLE語句
io
ALTER TABLE table_name DISABLE ALL TRIGGERS; ALTER TABLE table_name ENABLE ALL TRIGGERS; |
刪除觸發器使用DROP TRIGGER
DROP TRIGGER trigger_name; |