背景
結構化查詢語言(Structured Query Language,簡稱SQL)是用來訪問關系型數據庫一種通用語言,屬于第四代語言(4GL),其執行特點是非過程化,即不用指明執行的具體方法和途徑,而是簡單地調用相應語句來直接取得結果即可。顯然,這種不關注任何實現細節的語言對于開發者來說有着極大的便利。
然而,有些複雜的業務流程要求相應的程序來描述,這種情況下4GL就有些無能為力了。PL/SQL的出現正是為了解決這一問題,PL/SQL是一種過程化語言,屬于第三代語言,它與C、C++、Java等語言一樣關注于處理細節,可以用來實現比較複雜的業務邏輯。
主要特性
PL/SQL編輯器,功能強大——該編輯器具有語法加強、SQL和PL/SQL幫助、對象描述、代碼助手、編譯器提示、PL/SQL完善、代碼内容、代碼分級、浏覽器按鈕、超鍊接導航、宏庫等許多智能特性,能夠滿足要求性最高的用戶需求。當您需要某個信息時,它将自動出現,至多單擊即可将信息調出。
集成調試器(要求Oracle 7.3.4或更高)——該調試器提供您所需要的全部特性:跳入(Step In)、跳過(Step Over)、跳出(Step Out)、異常時停止運行、斷點、觀察和設置變量、觀察全部堆棧等。基本能夠調試任何程序單元(包括觸發器和Oracle8對象類型),無需作出任何修改。
PL/SQL完善器——該完善器允許您通過用戶定義的規則對SQL和PL/SQL代碼進行規範化處理。在編譯、保存、打開一個文件時,代碼将自動被規範化。該特性提高了您編碼的生産力,改善了PL/SQL代碼的可讀性,促進了大規模工作團隊的協作。
SQL窗口——該窗口允許您輸入任何SQL語句,并以栅格形式對結果進行觀察和編輯,支持按範例查詢模式,以便在某個結果集合中查找特定記錄。另外,還含有曆史緩存,您可以輕松調用先前執行過的SQL語句。該SQL編輯器提供了同PL/SQL編輯器相同的強大特性。
命令窗口——使用PL/SQL Developer的命令窗口能夠開發并運行SQL腳本。該窗口具有同SQL*Plus相同的感觀,另外還增加了一個内置的帶語法加強特性的腳本編輯器。這樣,您就可以開發自己的腳本,無需編輯腳本/保存腳本/轉換為SQL*Plus/運行腳本過程,也不用離開PL/SQL Developer集成開發環境。
報告——PL/SQL Developer提供内置的報告功能,您可以根據程序數據或Oracle字典運行報告。PL/SQL Developer本身提供了大量标準報告,而且您還可以方便的創建自定義報告。自定義報告将被保存在報告文件中,進而包含在報告菜單内。這樣,運行您自己經常使用的自定義報告就非常方便。
您可以使用Query Reporter免費軟件工具來運行您的報告,不需要PL/SQL Developer,直接從命令行運行即可。
工程——PL/SQL Developer内置的工程概念可以用來組織您的工作。一個工程包括源文件集合、數據庫對象、notes和選項。PL/SQL Developer允許您在某些特定的條目集合範圍之内進行工作,而不是在完全的數據庫或架構之内。這樣,如果需要編譯所有工程條目或者将工程從某個位置或數據庫移動到其他位置時,所需工程條目的查找就變得比較簡單,
To-Do條目——您可以在任何SQL或PL/SQL源文件中使用To-Do條目快速記錄該文件中那些需要進行的事項。以後能夠從To-Do列表中訪問這些信息,訪問操作可以在對象層或工程層進行。
對象浏覽器——可配置的樹形浏覽能夠顯示同PL/SQL開發相關的全部信息,使用該浏覽器可以獲取對象描述、浏覽對象定義、創建測試腳本以便調試、使能或禁止觸發器或約束條件、重新編譯不合法對象、查詢或編輯表格、浏覽數據、在對象源中進行文本查找、拖放對象名到編輯器等。
此外,該對象浏覽器還可以顯示對象之間的依存關系,您可以遞歸的擴展這些依存對象(如包參考檢查、浏覽參考表格、圖表類型等)。
性能優化——使用PL/SQL Profiler,可以浏覽每一執行的PL/SQL代碼行的時序信息(Oracle8i或更高),從而優化您SQL和PL/SQL的代碼性能。
更進一步,您還可以自動獲取所執行的SQL語句和PL/SQL程序統計信息。該統計信息包括CPU使用情況、塊I/O、記錄I/O、表格掃描、分類等。
HTML指南——Oracle目前支持HTML格式的在線指南。您可以将其集成到PL/SQL Developer工作環境中,以便在編輯、編譯出錯或運行時出錯時提供内容敏感幫助。
非PL/SQL對象——不使用任何SQL,您就可以對表格、序列、符号、庫、目錄、工作、隊列、用戶和角色進行浏覽、創建和修改行為。PL/SQL Developer提供了一個簡單易用的窗體,隻要将信息輸入其中,PL/SQL Developer就将生成相應的SQL,從而創建或轉換對象。
模闆列表——PL/SQL Developer的模闆列表可用作一個實時的幫助組件,協助您強制實現标準化。隻要點擊相應的模闆,您就可以向編輯器中插入标準的SQL或PL/SQL代碼,或者從草稿出發來創建一個新程序。
查詢構建器——圖形化查詢構建器簡化了新選擇語句的創建和已有語句的修改過程。隻要拖放表格和視窗,為區域列表選擇專欄,基于外部鍵約束定義聯合表格即可。
比較用戶對象——對表格定義、視圖、程序單元等作出修改後,将這些修改傳遞給其他數據庫用戶或檢查修改前後的區别将是非常有用的。這也許是一個其他的開發環境,如測試環境或制作環境等。而比較用戶對象功能則允許您對所選對象進行比較,将不同點可視化,并運行或保存應用必要變動的SQL腳本。
導出用戶對象——該工具可以導出用戶所選對象的DDL(數據定義語言)語句。您可以方便的為其他用戶重新創建對象,也可以保存文件作為備份。
工具——PL/SQL Developer為簡化日常開發專門提供了幾種工具。使用這些工具,您可以重新編譯全部不合法對象、查找數據庫源中文本、導入或導出表格、生成測試數據、導出文本文件、監控dbms_alert和dbms_pipe事件、浏覽會話信息等。
授權——大多數開發環境中,您不希望所有數據庫都具備PL/SQL Developer的全部功能性。例如,數據庫開發中您可以允許PL/SQL Developer的全部功能性,而數據庫測試中您可以僅允許數據查詢/編輯和對象浏覽功能,而數據庫制作中您甚至根本不希望PL/SQL Developer訪問。利用PL/SQL Developer授權功能,您可以方便的定義特定用戶或規則所允許使用的功能。
插件擴展——可以通過插件對PL/SQL Developer功能進行擴展。Add-ons頁面提供插件可以免費下載。Allround Automations或其他用戶均可提供插件(如版本控制插件或plsqldoc插件)。如果您具備創建DLL的編程語言,您還可以自己編寫插件。
多線程IDE——PL/SQL Developer是一個多線程IDE。這樣,當SQL查詢、PL/SQL程序、調試會話等正在運行時,您依然可以繼續工作。而且,該多線程IDE還意味着出現編程錯誤時不會中止:您在任何時間都可以中斷執行或保存您的工作。
易于安裝——不同于SQL*Net,無需中間件,也無需數據庫對象安裝。隻需點擊安裝程序按鈕,您就可以開始安裝從而使用軟件了。
過程與函數
PL/SQL中的過程和函數與其他語言的過程和函數一樣,都是為了執行一定的任務而組合在一起的語句。過程無返回值,函數有返回值。其語法結構為:
過程:Create or replace procedure procname(參數列表) as PL/SQL語句塊
函數:Create or replace function funcname(參數列表) return 返回值 as PL/SQL語句塊
為便于理解,舉例如下:
問題:假設有一張表t1,有f1和f2兩個字段,f1為number類型,f2為varchar2類型,要往t1裡寫兩條記錄,内容自定。
Create or replace procedure test_procedure as
V_f11 number :=1; /*聲明變量并賦初值*/
V_f12 number :=2;
V_f21 varchar2(20) :='first';
V_f22 varchar2(20) :='second';
Begin
Insert into t1 values (V_f11, V_f21);
Insert into t1 values (V_f12, V_f22);
End test_procedure; /*test_procedure可以省略*/
至此,test_procedure存儲過程已經完成,經過編譯後就可以在其他PL/SQL塊或者過程中調用了。函數與過程具有很大的相似性,此處不再詳述。
遊标
遊标的定義為:用遊标來指代一個DML SQL操作返回的結果集。即當一個對數據庫的查詢操作返回一組結果集時,用遊标來标注這組結果集,以後通過對遊标的操作來獲取結果集中的數據信息。這裡特别提出遊标的概念,是因為它在PL/SQL的編程中非常的重要。定義遊标的語法結構如下:
cursor cursor_name is SQL語句;
在本文第一段代碼中有一句話如下:
cursor c_emp is select * from employee where emp_id=3;
其含義是定義一個遊标c_emp,代表employee表中所有emp_id字段為3的結果集。當需要操作該結果集時,必須完成三步:打開遊标、使用fetch語句将遊标裡的數據取出、關閉遊标。
遊标用來處理從數據庫中檢索的多行記錄(使用SELECT語句)。利用遊标,程序可以逐個地處理和遍曆一次檢索返回的整個記錄集。
為了處理SQL語句,Oracle将在内存中分配一個區域,這就是上下文區。這個區包含了已經處理完的行數、指向被分析語句的指針,整個區是查詢語句返回的數據行集。遊标就是指向上下文區句柄或指針。
顯式
顯示遊标被用于處理返回多行數據的SELECT 語句,遊标名通過CURSOR….IS 語句顯示地賦給SELECT 語句。
在PL/SQL中處理顯示遊标所必需的四個步驟:
1)聲明遊标;CURSOR cursor_name IS select_statement
2)為查詢打開遊标;OPEN cursor_name
3)取得結果放入PL/SQL變量中;
FETCH cursor_name INTO list_of_variables;
FETCH cursor_name INTO PL/SQL_record;
4)關閉遊标。CLOSE cursor_name
注意:在聲明遊标時,select_statement不能包含INTO子句。當使用顯示遊标時,INTO子句是FETCH語句的一部分。
隐式
所有的隐式遊标都被假設為隻返回一條記錄。
使用隐式遊标時,用戶無需進行聲明、打開及關閉。PL/SQL隐含地打開、處理,然後關掉遊标。
例如:
SELECT studentNo,studentName
INTO curStudentNo,curStudentName
FROM StudentRecord
WHERE name=’gg’;
上述遊标自動打開,并把相關值賦給對應變量,然後關閉。執行完後,PL/SQL變量curStudentNo,curStudentName中已經有了值。
變量
就像其他的程序語言一樣,變量是在程序中出現最頻繁的名詞,在PL/SQL中的學習中首先需要了解變量的一些基本概念和使用方法。
PL/SQL程序包括了四個部分,在四個部分中,聲明部分主要用來聲明變量并且初始化變量,在執行部分可以為變量賦新值,或者在表達式中引用變量的值,在異常處理部分同樣可以按執行部分的方法使用變量。另外,在PL/SQL程序使用時可以通過參數變量把值傳遞到PL/SQL塊中,也可以通過輸出變量或者參數變量将值傳出PL/SQL塊。
在定義變量、常量标識符時需要注意下面的一些基本規則:
⒈定義的标識符名稱應該遵循命名規則,在後面将會提到主要的命名規則;
⒉在聲明量和變量的時候可以為其設置初始化值,也可以強制設置not null;
⒊可以使用值運算符(:=)或DEFAULT 保留字來初始化标識符,為标識符賦初始值;
⒋在聲明标識符時,每行隻能聲明一個标識符。
在PL/SQL中主要使用下面三種類型的變量(或者常量):
⒈簡單變量;
⒉複合(組合)變量;
⒊外部變量。
三種變量分别用于存放不同特性的數據。
基本語法
在寫PL/SQL語句時,必須遵循一些基本的語法,下面是PL/SQL程序代碼的基本語法要求:
⒈語句可以寫在多行,就像SQL語句一樣;
⒉各個關鍵字、字段名稱等等,通過空格分隔;
⒊每條語句必須以分号結束,包括PL/SQL結束部分的END關鍵字後面也需要分号;
⒋标識符需要遵循相應的命名規定;
⑴名稱最多可以包含30個字符;
⑵不能直接使用保留字,如果需要,需要使用雙引号括起來;
⑶第一個字符必須以字母開始;
⑷不要用數據庫的表或者科學計數法表示;
還有一些語法相關的規則:
⒈在PL/SQL程序中出現的字符值和日期值必須用單引号括起;
⒉數字值可以使用簡單數字或者科學計數法表示;
⒊在程序中最好養成添加注釋的習慣,使用注釋可以使程序更清晰,使開發者或者其他人員能夠很快的理解程序的含義和思路。在程序中添加注釋可以采用:
⑴/*和*/之間的多行注釋;
⑵以--開始的單行注釋。
例子
DECLARE
salary emp.sal%TYPE := 0;
mgr_num emp.mgr%TYPE;
last_name emp.ename%TYPE;
starting_empno emp.empno%TYPE := 7499;
BEGIN
SELECT mgr INTO mgr_num FROM emp
WHERE empno = starting_empno;
WHILE salary <= 2500 LOOP
SELECT sal,mgr,ename INTO salary,mgr_num,last_name
FROM emp WHERE empno = mgr_num;
END LOOP;
INSERT INTO temp VALUES (NULL,salary,last_name);
COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
INSERT INTO temp VALUES (NULL,NULL,'Not found');
COMMIT;
END;
/*Please View The Example Code Reference*/