Oracle資料庫開發必備利器之PL/SQL
第一章 概述
1.PL/SQL簡介
Oracle PL/SQL語言(Procedural Language/SQL)是結合了結構化查詢與Oracle自身過程控制為一體的強大語言,支援多種資料型別,擁有自身的變數宣告、賦值語句,而且還有條件、迴圈等流程控制語句。過程控制結構與SQL資料處理能力無縫的結合形成了強大的程式語言,可以建立過程和函式以及程式包。
PL/SQL是一種塊結構的語言,它將一組語句放在一個塊中,一次性發送給伺服器,PL/SQL引擎分析收到PL/SQL語句塊的內容,把其中的過程控制語句由PL/SQL引擎自身去執行,把PL/SQL塊中的SQL語句交給伺服器的sql語句執行器執行。
PL/SQL 塊傳送給伺服器後,先被編譯然後執行,對於有名稱的 PL/SQL 塊(如子程式)
可以單獨編譯,永久的儲存在資料庫中,隨時準備執行。PL/SQL 的優點還有:
1.支援SQL PL/SQL支援所有的SQL資料操縱命令、遊標控制命令、事物控制命令、SQL函式、運算子和偽列。支援所有的SQL資料型別和null值。
2.支援面向物件程式設計 在PL/SQL中可以建立型別,可以對型別進行及成果,可以在子程式中過載方法等。
3.更好的效能 SQL是非過程語言,只能一條一條的執行,而PL/SQL把一個PL/SQL塊統一進行編譯後執行,同時還可以把編譯好的PL/SQL塊儲存起來,減少了應用程式額伺服器之間的通訊時間,PL/SQL是快速而高效的。
4.可移植性 使用PL/SQL編寫的應用程式,可以移植到任何的操作平臺上的Oracle伺服器上,同時還可以編寫可移植程式庫,在不同環境中重用。
5.安全性 可以通過儲存過程對客戶機伺服器之間的應用程式邏輯進行分隔,這樣可以限制對Oracle資料庫的訪問,資料庫還可以授權和撤銷其他使用者的訪問能力。
2.PL/SQL塊
PL/SQL是一種快結構的語言,一個PL/SQL程式包含了一個或者多個邏輯快,邏輯快中可以宣告變數,變數在使用之前必須先宣告。除了正常的執行程式外,還提供了專門的異常處理部分進行異常處理。每個邏輯塊分為是三個部分。
語法結構:PL/SQL塊
[DECLARE
---declaration statements]//說明部分,變數和常量的定義,如果不宣告可省略
[BEGIN
---executable statements]//以END結尾,程式體,END後面也用分號
[EXCEPTION
---exception statements]//異常處理部分,可選,出現異常時跳轉到異常部分執行
PL/SQL是一種程式語言,也有自身的語言特點:
1.對大小寫不敏感,為了良好的程式風格,開發團隊都會選擇一個合適的編碼標準。
2.PL/SQL塊中的每一條語句都必須以分號結束,SQL語句可以是多行的,但分號表示該語句結束。一行中可以有多條sql語句,他們之間以分號分割,但是不推薦一行中寫多條語句。
PL/SQL中的特殊符號說明:
第二章 PL/SQL基礎語法
1.PL/SQL資料型別
PL/SQL的資料型別包括標量資料型別,引用資料型別和儲存文字、影象、視訊、聲音等非結構化的大資料型別等。
1.標量資料型別
標量資料型別的變數只有一個值,且內部沒有分量。標量資料型別包括數字型、字元型、日期型和布林型。
2.屬性資料型別
當一個變數的值是資料庫中的一行或者是資料庫中某列時,可以直接使用屬性型別來宣告。Oracle中存在兩種屬性型別:%TYPE和%ROWTYPE。
%ROWTYPE:引用資料庫表中的一行作為資料型別,即RECODE型別(記錄型別),是PL/SQL附加的資料型別。表示一條記錄,就相當於C#中的一個物件。可以使用“.”來訪問記錄中的屬性。
程式碼演示:
SQL> DECLARE
myemp EMP%ROWTYPE; //宣告一個myemp物件,該物件表示EMP表中的一行
BEGIN
SELECT * INTO myemp FROM emp WHERE empno=7934; //從EMP表中查詢出一條記錄放入myemp物件中
dbms_output.put_line(myemp.ename); 訪問該物件的屬性可以使用“.”
END;
/
MILLER
%TYPE:引用某個變數或者資料庫的列的型別作為某變數的資料型別。
2.PL/SQL條件控制和迴圈控制
PL/SQL程式可通過條件或迴圈結構來控制命令執行的流程。PL/SQL提供了豐富的流程控制語句。有三種控制結構:順序結構、條件結構、迴圈結構。
1.條件控制(if語句)
1.if-then
語法結構:if 條件 then
--條件結構體
end if;
2.if-then-else
語法結構:if 條件 then
--條件成立結構體
else
--條件不成立結構體
end if;
3.if-then-elsif
語法結構:if 條件1 then
--條件1成立結構體
elsif 條件2 then
--條件2成立結構體
else
--以上條件都不成立結構體
end if;
2.case
case是一種選擇結構的控制語句,可以根據條件從朵兒執行分支中選擇相應的執行動作。也可以作為表示式使用,返回一個值,類似於switch語句。
語法結構:
case[selector]
when 表示式1 then 語句序列1;
when 表示式2 then 語句序列2;
......
[else 語句序列 n]
end case;
3.迴圈結構
Oracle提供的迴圈型別有:
1.無條件迴圈loop-end loop 語句
2.while迴圈語句
3.for迴圈語句
1.loop迴圈(無限迴圈)
語法格式:loop
-迴圈體
end loop;
2.while迴圈
語法格式:while 條件 loop
--迴圈體
end loop;
3.for迴圈
for迴圈需要預先確定迴圈次數,可通過給迴圈變數指定下限和上限來確定迴圈執行的次數,然後迴圈變數在每次迴圈中遞增(或者遞減)。
語法結構:
for 迴圈變數 in[reverse] 迴圈下限...迴圈上限 loop loop
--迴圈體
end loop;
注:reverse:指明迴圈從上限向下限一次迴圈。
4.順序結構
在程式順序結構中有兩個特殊的語句,goto和null
1.goto語句
goto語句將無條件的跳轉到標籤指定的語句中去執行。標籤是用雙尖括號括起來的標示塊,在PL/SQL塊中必須具有唯一的名稱,標籤後必須緊跟可執行語句或者PL/SQL塊。goto不能跳轉到if語句、case語句、loop語句或者字塊中。
2.null語句
null語句什麼都不做,只是將控制權轉到下一行語句中。null語句是可執行語句。null語句在if或者其他語句語法要求至少執行一條可執行語句,但又不需要具體操作的地方。
3.游標(cursor,也稱遊標)
Oracle會建立一個儲存區域,被稱為上下文區域,用於處理SQL語句,其中包含需要處理的語句,例如所有的資訊,行數處理,等等。
遊標是指向這一上下文的區域。 PL/SQL通過控制游標在上下文區域。遊標持有的行(一個或多個)由SQL語句返回。行集合游標保持的被稱為活動集合。可以命名一個游標,它可以在程式中獲取和處理SQL語句,一次返回的行引用。有兩種型別的遊標:隱式遊標、顯式遊標。
1.隱式遊標
Oracle在一個SQL語句的執行,當沒有顯式遊標的語句隱式遊標時自動建立。程式設計師無法控制隱式遊標其中的資訊。
每當發出一個DML語句(INSERT,UPDATE和DELETE),隱式遊標與此語句關聯。對於INSERT操作時,游標保持一個需要插入的資料。對於UPDATE和DELETE操作,游標標識會受到影響的行。
在PL/SQL,可以參考最近的隱式遊標的SQL遊標,它有類似%FOUND,%ISOPEN,%NOTFOUND,和%ROWCOUNT屬性。在SQL遊標有額外的屬性,%BULK_ROWCOUNT和%BULK_EXCEPTIONS,設計用於所有語句中使用。下表提供了最常用的屬性的描述:
2.顯示遊標
顯式遊標是程式設計師定義遊標獲得更多的控制權的上下文的區域。顯式遊標應在PL/SQL塊的宣告部分中定義。這是建立一個SELECT語句返回多行。
建立顯式遊標語法是:cursor cursor_name is select_statement;
3.使用顯示遊標的四個工作步驟:
1.宣告遊標用於初始化在儲存器
2.開啟遊標分配記憶體
3.獲取遊標檢索資料
4.關閉遊標釋放分配的記憶體
4.宣告遊標
宣告遊標定義的名稱和相關的select語句。例如:
CURSOR c_customers IS
SELECT id,name,address FROM customers;
5.開啟遊標
開啟遊標分配記憶體,使得它準備的SQL語句轉換成它返回的行。例如:
OPEN c_customers;
6.獲取遊標
獲取遊標涉及一次訪問一次。例如:將獲取行從上面開啟的遊標:
FETCH c_customers INTO c_id,c_name,c_addr;
7.關閉遊標
關閉遊標來釋放分配的記憶體。例如:關閉前面開啟的遊標
CLOSE c_customers;
4.PL/SQL的異常處理
在程式執行時出現的錯誤稱為異常。發生異常後,語句將停止執行。PL/SQL引擎立即將控制權轉到PL/SQL塊的異常處理部分。異常處理機制簡化了程式碼中的錯誤檢查。PL/SQL中任何異常出現時,每一個異常都對應一個異常碼和異常資訊。
1.預定義異常
為了oracle開發和維護的方便,在Oracle異常中,為常見的異常碼定義了對應的異常名稱,稱為預定義異常。常見的預定義異常有:
語法格式:異常處理
begin
--可執行部分
exception --異常處理開始
when 異常名1 then
--對應異常處理
when 異常名2 then
--對應異常處理
......
when others then
--其他異常處理
end;
2.自定義異常
除了自定義異常外,使用者還可以在開發中自定義異常,自定義異常尅讓使用者採用與PL/SQL引擎處理錯誤相同的方式進行處理,使用者自定義異常有兩個關鍵點:
異常定義:採用關鍵字exception宣告異常。例如:myexception exception;
異常引發:在程式可執行區域,使用raise關鍵字進行引發。例如:raise myexception
程式碼演示:自定義異常
DECLARE
2 sal emp.sal%TYPE;
3 myexp EXCEPTION;
4 BEGIN
5 SELECT sal INTO sal FROM emp WHERE ename='JAMES';
6 IF sal<5000 THEN
7 RAISE myexp;
8 END IF;
9 EXCEPTION
10 WHEN NO_DATA_FOUND THEN
11 dbms_output.put_line('NO RECORDSET FIND!');
12 WHEN MYEXP THEN
13 dbms_output.put_line('SAL IS TO LESS!');
14 END;
5.總結
1.PL/SQL 是一種塊結構的語言,它將一組語句放在一個塊中,一次性發送給伺服器,PL/SQL 引擎把接收到 PL/SQL 語句塊中的內容進行分析,把其中的過程控制語句由PL/SQL 引擎自身去執行,把 PL/SQL 語句塊中的 SQL 語句交給伺服器的 SQL 語句執行器執行。
2.PL/SQL 的資料型別包括標量資料型別,引用資料型別和儲存文字、影象、視訊、聲音等非結構化得大資料型別(LOB 資料型別)等。
3.Oracle 中存在兩種屬性型別:%TYPE 和%ROWTYPE。
4.PL/SQL 程式可通過控制結構來控制命令執行的流程。PL/SQL 中提供三種程式結構:順序結構、條件結構和迴圈結構。
5.在 PL/SQL 程式開發中,可以使用 DML 語句和事務控制語句,還可以動態執行 SQL語句,動態執行 SQL 語句的命令是:EXECUTE IMMEDIATE。
6.在程式執行時出現的錯誤,稱為異常。發生異常後,語句將停止執行,PL/SQL 引擎立即將控制權轉到 PL/SQL 塊的異常處理部分。PL/SQL 中任何異常出現時,每一個異常都對應一個異常碼和異常資訊。