今天這一篇要介紹o racle 中的PL/SQL , Procedural Language extension to SQL.

其主要功能提供:

1.SQL上程式上的延伸。

2.跨平台與跨產品的使用。

3.高度安全與資料完整性的保護。

4.支援物件導向內容。

PL/SQL 提供一個通用的程式開發環境,可以跨平台與跨硬體,它程式架構包含了if-then,case與loop,也可以宣告常數與變數、定義程序與函式,收集物件的型態與除錯。PL/SQL能被多種語言所使用,包含C、C++與JAVA。

操作者不需要資料需要得資料結構能否被讀取,也不需要知道讀取其他物件的權限,只需要透過呼叫PL/SQL,即可操作資料庫。因為PL/SQL在資料庫內運作,非常適合應運在資料操作密集的操作與網路速度慢的應用系統上。

作為一個DBA ,你可能不需要常常回應系統開發者,如和感上PL/SQL code在資料庫中執行時的loading,也可能不常使用pl/sql撰寫應用程式,但你一定要對於他的物件徹底了解,進而建議開發者如何使用與了解有問題的物件。

PL/SQL物件可以分成許多型態:

1.package:包含一組有邏輯關聯procedures 與 function的集合。通常也稱為specification,

用來描述應用程式的interface。包含宣告的型態、變誤、常數、例外與子程式等,可以使用的內容。

2.package body:完整定義與實作子程式與cursors的內容。

3.type body: 使用者定義的方法的集合(procedures 與 function)。

4.procedure:PL/SQL具體的內容

5.function:一段PL/SQL語法,能利用RETURN語法回傳數值。

6.trigger:觸發程式,能在資料庫部分操作發生時執行。他可以建立在資料表上,像是有資料新增後執行;也可以作為資料庫的事件,如有使用者登入資料庫。

function:

如同我們一般在寫程式,寫部分程式區塊作一些處理,然後回傳其結果。

oracle已經內見許多function在內不可以使用,如SYSDATE, SUM ,AVG..等

其語法範例如下
CREATE OR REPLACE FUNCTION compute_tax(salary NUMBER)

RETURN NUMBER 

AS 

BEGIN

    IF salary < 7000 THEN

        RETURN salary * .19

    ELSE 

        RETURN salary * .33

    ENDIF;

END;


procedures:

用來執行特定行為,傳遞數值可以使用參數列。

可以在SQL語法中使用CALL呼叫,可以在SQL PLUS使用EXECUTE呼叫,與function相同,可以使用IF-ELSE、CASE與LOOP語法。

package:

為funciton與procedure的群集,進行有效維護管理,每個package應該分成兩個部分。

1.package specification:像是package的header,記錄package的型態與funciton、procedure與變數的定義。

2.package body:funciton、procedure的程式主體。

呼叫方法:package_name.procedure_name (or function_name)

當body被改寫的時候會被重新編義,但其specification不會被影響。

注意事項:

你可以建立specification但不建立body, 但不能建立body不建立specification

在oracle中,已經建立超過350個PL/SQL PACKAGE,主要是提供作為管理與維護的工具與延伸功能。(如DBMS_STATUS、DBMS_OUTPUT...等等)

我們可以使用DESCRIBE的命令檢視子程式。

Triggers:

為一種PL\SQL 程式物件,可以在某些事情執行的時後啟動運作。像是insert資料到 table,登入資料庫,或者常是刪掉資料表或改變設定等等。通常trigger用來呼叫procedure 或funciton,讓trigger的程式碼簡便,而讓其他程式碼放在package中。

多數的DBA會用triggers來檢查資料,加強限制。

triggers能設定在發生前或發生後。

triggers的事件分類:

DML: INSERT, UPDATE, DELETE

DDL: CREATE, DROP,ALTER,GRANT,REVOKE,RENAME

Database:LOGON,LOGOFF,STARTUP,SHUTDOWN,SERVERERROR,SUSPEND

--

寫鐵人寫到睡著...

晚點來補前一天的...

加油,剩下幾天~!!