1、認識PL/SQL
結構化查詢語言(Structured Query Language,SQL)是用來訪問和操作關係型資料庫的一種標準通用語言,它屬於第四代語言(4GL),簡單易學,使用它可以很方便 地呼叫相應語句來取得結果。該語言的特點就是非過程化。也就是說,使用的時候不用指明執行的具體方法和途徑,即不用關注任何的實現細節。但這個語言也有一個問題,就是在某些情況下滿足不了複雜業務流程的需求,這就是第四代語言的不足之處。Oracle中的PL/SQL語言正是為了解決這一問題,PL/SQL屬於第三代的語言(3GL),也就是過程化的語言,同Java、C#一樣可以關注細節,用它可以實現複雜的業務邏輯。
PL/SQL(Procedural Language/Structured Query Language )是Oracle公司在標準SQL語言基礎上進行擴充套件而形成的一種可以在資料庫上進行設計程式設計的語言,通過Oracle的PL/SQL引擎執行。PL/SQL完全能可以像Java語言一樣實現邏輯判斷、條件迴圈以及異常處理等,這是標準的SQL很難辦到的事情。由於它的基礎是標準的SQL語句,使得資料庫開發人員能快速的掌握並運用。PL/SQL特點有:
- 支援事物控制和SQL資料操作命令。
- 支援SQL的所有資料型別,並且在此基礎上擴充套件了新的資料型別,也支援SQL的函式以及運算子。
- PL/SQL可以儲存在Oracle伺服器中。
- 伺服器上的PL/SQL程式可以使用許可權進行控制。
- Oracle有自己的DBMS包,可以處理資料的控制和定義命令。
2、PL/SQL的優勢
由於PL/SQL語言是從SQL語言擴充套件而來,所以PL/SQL除了支援SQL資料型別和函式外,同時也支援Oracle物件型別。另外,同傳統的SQL語言相比PL/SQL有以下幾個優點:
(1)可以提高程式的執行效能
標準的SQL執行時,只能一條一條地向Oracle伺服器傳送。假如完成一個業務邏輯需要幾條甚至幾十條SQL語句,那麼這個過程中,客戶端會幾十次的連線資料庫伺服器,而連線資料庫本身是一個很耗費資源的過程,當這個業務被完成時,會浪費大量的資源在網路連線上。
換用PL/SQL語句,結果則不一樣了。PL/SQL的語句塊可以包含多條SQL語句,而語句塊可以嵌入到程式中,甚至可以儲存到Oracle伺服器上。這樣使用者只需要連線一次資料庫就可以把需要的引數傳遞過去,其它的部分將在Oracle伺服器內部執行完成,然後返回結果。這樣就節省了網路資源的開銷。
(2)可以使程式模組化
在程式塊中可以實現一個或幾個 功能。例如,當想把一個動物模型儲存到資料庫裡時,可能涉及幾張表,如果使用標準的SQL完成該功能需要多條語句,而使用塊,則可以把對多張表的操作都放到一個塊內,而對外只提供一個呼叫方式和需要傳入的引數。
使用塊也可以把資料庫資料同客戶程式隔離開來,使得資料庫表結構發生變化時,對呼叫者的影響減小到最低程度。
(3)可以採用邏輯控制語句來控制程式結構
如果一個PL/SQL程式塊中只能順序的執行基本的SQL語句,那麼它的意義實在有限。實際上PL/SQL可以利用條件或迴圈語句來控制程式的流程,這麼做就大大增加了PL/SQL的實用性,利用邏輯控制語句來完成複雜的業務。
(4)利用處理執行時的錯誤資訊
標準的SQL在遇到錯誤是會提示異常。一旦有異常就會終止,但是呼叫者卻很難快速的發現錯誤點在哪兒,即使發現出問題的地方也只能是告訴開發人員該語句程式本身有問題,而不是邏輯上的問題。利用PL/SQL還可以處理一些程式上的異常,不至於因終止SQL操作,而造成SQL的展示頁面出現生硬的錯誤提示。
3、PL/SQL的結構
PL/SQL程式的基本單位是塊(block),PL/SQL塊很明確的分為三部分,其中包括宣告部分、執行部分和異常部分。其中,宣告部分以DECLARE為開始標誌,執行部分以BEGIN 為開始標誌,而異常部分以EXCEPTION為開始標誌。其中的執行部分是必需的,其餘的的兩個部分則可選。
無論PL/SQL程式段的程式碼量有多少,它的基本結構只是由這三部分組成。
(1)只有執行體的部分,也就是隻有“BEGIN ....END ;”部分,該示例輸出一句話:
BEGIN
dbms_output.put_line('這是執行體部分。。。');
END ;
(2)包含宣告和執行兩部分的結構
該示例除了執行體部分還有宣告部分,具體操作是宣告一個變數,然後為變數賦值,最後輸出該變數的值。
DECLARE
v_result NUMBER(8,2);
BEGIN
v_result:=100/6 ;
dbms_output.put_line('最後的結果:'||v_result);
END;
SELECT....INTO....語句是PL/SQL特有的賦值語句,該語句表示的意思是SELECT後面列出要查詢的欄位列表,INTO後面是變數名稱,它表示把查詢出來的值儲存到變數中。需要注意的是,SELECT後列名順序和INTO後變數名順序要一一對應,還有就是該型別語句每次只能返回一條記錄,如果返回的記錄超過一條或沒有返回記錄都會引發異常。