Oracle 過程(Procedure)、函數(Function)、包(Package)、觸發器(Trigger)

來源:互聯網
上載者:User
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程式和沒有打包的有很大的差異,包資料在使用者的整個會話期間都一直存在,當使用者獲得包的執行授權時,就等於獲得包規範中的所有程式和資料結構的許可權。但不能只對包中的某一個函數或過程進行授權。包可以重載過程和函數,在包內可以用同一個名字聲明多個程式,在運行時根據參數的數目和資料類型調用正確的程式。

  建立包必須首先建立包規範,建立包規範的文法如下:

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 伺服器錯誤發生時觸發觸發器,事件後觸發

  建立觸發器的文法如下:

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語句:

ALTER TRIGGER trigger_name ENABLE;
ALTER TRIGGER
trigger_name DISABLE;

  要禁用或啟用表的所有觸發器,使用ALTER TABLE語句

ALTER TABLE table_name DISABLE ALL TRIGGERS;
ALTER TABLE
table_name ENABLE ALL TRIGGERS;

  刪除觸發器使用DROP TRIGGER

DROP TRIGGER trigger_name;

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.