什麼是PL/SQL
标準的SQL語言提供了定義和操縱資料庫對象的能力,但是并沒有提供程式設計語言所具有的諸多特性。PL/SQL(Procedural Language/SQL)就是為标準SQL語言添加了過程化功能的一門程式設計語言。這讓SQL語句擁有了結構化程式設計的特性,使得開發人員可以直接使用PL/SQL進行複雜業務邏輯的編寫。
功能特點
結構化程式設計
- 順序結構
- 分支結構
- 循環結構
與SQL語言整合
要注意的是,在PL/SQL代碼中隻能直接使用DML語句,如果在PL/SQL代碼中直接使用SQL的DDL語句,Oracle将會提示綁定錯誤,例如這樣就是錯誤的:
BEGIN
CREATE TABLE BOOKS(ID int NOT NULL,BOOKNAME varchar2() NULL);
END;
執行以上代碼會報錯,這是由PL/SQL的早起綁定特性所決定的,在編譯時PL/SQL引擎發現BOOKS表不存在,會引起編譯時錯誤。如果修改為以下寫法,就沒問題了:
DECLARE
--定義SQL DDL語句
v_SQLStr VARCHAR(200):=' CREATE TABLE BOOKS(ID int NOT NULL,BOOKNAME varchar2() NULL) ';
BEGIN
EXECUTE IMMEDIATE v_SQLStr; --執行DDL語句
END;
面向對象開發
PL/SQL可以基于對象類型來定義對象表,或者将對象類型作為Oracle表列進行儲存。
子產品化應用程式開發
PL/SQL提供塊、子程式和包3個程式單元,可以将程式分成多個部分,将複雜的問題劃分開來,做到子產品化。
提高應用程式性能
PL/SQL的塊結構運作一次性向資料庫發送多條SQL語句,可以顯著的提升應用程式的性能。在使用Java、.NET之類語言開發程式時,往往是一次一條SQL語句的方式操作資料庫,這将會産生多次網絡傳輸互動,是的伺服器需要使用較多的資源來處理SQL語句,同時産生了一定的網絡流量。
語言特性
PL/SQL塊結構
塊分為兩種:
- 匿名塊,沒有名稱的PL/SQL塊,這種塊不會儲存在資料庫中
- 命名塊,具有名稱的PL/SQL塊
命名塊又分為三種:
- 使用<<塊名稱>>進行辨別的塊
- 由函數或過程組成的子程式塊,這種塊儲存在資料庫中
- 資料庫觸發器塊
變量和類型
- 标量變量:指能存放但是數值的變量,這是最常用的變量。标量變量的資料類型包含數字、字元、日期和布爾類型,比如VARCHAR2、CHAR、NUMBER、DATE等類型。
- 複合變量:指用于存放多個值得變量,比如PL/SQL記錄、PL/SQL表、嵌套表及VARRAY等類型。
- 參照變量:指用于存放數值指針的變量,比如遊标變量和對象變量。
-
LOB變量:指用于存放大批量資料的變量。
例如:
DECLARE
v_DeptName VARCHAR2(); --定義标量變量
v_LoopCounter BINARY_INTEGER; --使用PL/SQL類型定義标量變量
--定義記錄類型
TYPE t_Employee IS RECORD (EmpName VARCHAR2(),EmpNo NUMBER(),Job VARCHAR2());
v_Employee t_Employee; --定義記錄類型變量
TYPE csor IS REF CURSOR; --定義遊标變量
v_date DATE NOT NULL DEFAULT SYSDATE;--定義變量并指定預設值
BEGIN
NULL;
END;
/
程式控制語句
- 條件控制語句:IF-THEN-ELSE,CASE-WHEN
- 循環控制語句:LOOP-END簡單循環,數字式FOR循環,WHILE循環
過程、函數與包
過程。函數與包都屬于命名塊,過程和函數統稱為子程式。
觸發器
與包或其他子程式不同的是,觸發器不能被顯式的調用,而是在資料庫時間發生時隐式的運作的,并且觸發器不能接收參數。
結構化異常處理
異常處理塊以EXCEPTION開始。在錯誤發生時,Oracle預定義的異常會被系統隐式的抛出,對于使用者自定義的異常,可以使用RAISE語句手動抛出。當異常被抛出後,異常處理器将捕捉到這些異常,然後執行異常處理代碼。
集合與記錄
集合與記錄都是用複合類型。
集合允許将類型相同的多個變量當做一個整體進行處理,類似于Java或C語言中的數組,可以同時處理單行多列的資料。
記錄允許将多個不同類型的變量當做一個整體進行處理,類似于資料庫中的一條記錄。一個記錄類型可以包含多個簡單類型的值或複雜類型的值。
遊标
遊标是一個指向上下文區域的指針,這個上下文區域是PL/SQL語句塊在執行SELECT語句或DML資料操縱語句時配置設定的 。遊标分為兩種:
- 隐式遊标:由PL/SQL自動為DML語句或SELECT-INTO語句配置設定的遊标,包括隻傳回一條記錄的查詢操作。
- 顯式遊标:在PL/SQL塊的聲明區域中顯示定義的,用來處理傳回多行記錄查詢的遊标。
動态SQL
PL/SQL是使用早期綁定來執行SQL語句的,早期綁定要求所處理的資料庫對象必須存在并且是已知的。
動态SQL是指在運作時由字元串拼合而成的SQL,比如在PL/SQL塊中不能執行DDL語句和DCL語句,那麼可以使用EXECUTE IMMEDIATE來執行動态拼合而成的SQL語句。