什麼是PL/SQL程式
前面第4章學習的標準化的SQL語言對資料庫進行各種操作,每次只能執行一條語句,語句以英文的分號“;”為結束標識,這樣使用起來很不方便,同時效率較低,這是因為Oracle資料庫系統不像VB、VC這樣的程式設計語言,它側重於後台資料庫的管理,因此提供的編程能力較弱,而結構化程式設計語言對資料庫的支援能力又較弱,如果一些稍微複雜點的管理工作都要藉助程式設計語言來實現的話,這對管理員來講是很大的負擔。
正是在這種需求的驅使下,從Oracle 6開始,Oracle公司在標準SQL語言的基礎上發展了自己的PL/SQL(Procedural Language/SQL,過程化SQL語言)語言,將變數、控制結構、過程和函數等結構化程式設計的要素引入了SQL語言中,這樣就能夠編製比較複雜的SQL程式了,利用PL/SQL語言編寫的程式也稱為PL/SQL程式塊。
PL/SQL程式塊的主要特點如下。
具有模組化的結構。
使用過程化語言控制結構。
能夠進行錯誤處理。
PL/SQL程式塊只能在【SQL Plus】、【SQLPlus Worksheet】等工具支援下以解釋型方式執行,不能編譯成可執行檔,脫離支撐環境執行。
PL/SQL執行個體分析
下面將為前面建立的tempuser使用者建立一個名為testtable的資料表。
在該表中有recordnumber整數型欄位和currentdate時間型欄位,編製一個PL/SQL程式完成向該表中自動輸入100個記錄,要求recordnumber欄位從1到100,currentdate欄位為當前系統時間。
(1)前面建立的tempuser使用者預設的資料表空間為USERS,因此,要想使該使用者能夠使用資料表空間建立資料方案對象,必須首先給其賦予名為“RESOURCE”的角色。
(2)以system使用者、SYSDBA身份登入資料庫後,在【企業管理器】中按照修改使用者的步驟進行操作,直到出現如圖9.1所示的編輯使用者的【角色】選項卡。
在【可用】下拉式清單方塊中選擇“RESOURCE”,單擊按鈕將其添加到【已授予】列表框中。【預設值】儲存格被選中,單擊“確定”按鈕。
(3)讀者也可以在【SQLPlus Worksheet】中直接執行如下SQL程式碼完成上述操作。
―――――――――――――――――――――――――――――――――――――
GRANT "RESOURCE" TO "TEMPUSER";
ALTER USER "TEMPUSER" DEFAULT ROLE ALL
―――――――――――――――――――――――――――――――――――――
【配套程式位置】:第9章\grantrole.sql。
(4)按照建立資料表的操作步驟進行,直到出現如圖9.2所示的建立表的【一般資訊】選項卡。
在【名稱】文字框中輸入“testable”。
在【方案】下拉式清單方塊中選擇“tempuser”。
在【資料表空間】下拉式清單方塊中選擇“users”。
選擇【表】/【標準】單選鈕。
選擇【定義列】單選鈕。
在【表列定義區】中輸入兩個資料列的定義。
完成設定後單擊按鈕。
(5)讀者也可以在【SQLPlus Worksheet】中直接執行如下SQL程式碼完成上述操作。
―――――――――――――――――――――――――――――――――――――
CREATE TABLE "TEMPUSER"."TESTTABLE" ("RECORDNUMBER" NUMBER(4) NOT
NULL, "CURRENTDATE" DATE NOT NULL)
TABLESPACE "USERS"
―――――――――――――――――――――――――――――――――――――
【配套程式位置】:第9章\createtesttable.sql。
(6)以tempuser使用者身份登入【SQLPlus Worksheet】,執行下列SQL程式碼完成向資料表tempuser.testable中輸入100個記錄的功能。執行結果如圖9.3所示。
―――――――――――――――――――――――――――――――――――――
set serveroutput on
declare
maxrecords constant int:=100;
i int :=1;
begin
for i in 1..maxrecords loop
insert into tempuser.testtable(recordnumber,currentdate)
values(i,sysdate);
end loop;
dbms_output.put_line('成功錄入資料!');
commit;
end;
―――――――――――――――――――――――――――――――――――――
【配套程式位置】:第9章\inserttesttable.sql。
(7)在【SQLPlus Worksheet】中執行下列語句,查詢插入的資料,結果如圖9.4所示。
―――――――――――――――――――――――――――――――――――――
select * from tempuser.testtable;
―――――――――――――――――――――――――――――――――――――
【配套程式位置】:第9章\selecttesttable.sql。
對完成上述資料插入過程的PL/SQL程式的分析如表9.1所示。
表9.1 PL/SQL執行個體程式碼分析
| 程式碼 |
說明 |
| set serveroutput on |
允許伺服器輸出 |
| declare |
定義部分標識 |
| maxrecords constant int:=100; |
定義maxrecords為整型常量100 |
| i int :=1; |
定義i為整型值變數,初值為1 |
| Begin |
執行部分標識 |
| for i in 1..maxrecords loop |
i從1迴圈到maxrecords |
| Insert into tempuser.testtable(recordnumber,currentdate) values (i,sysdate); |
向資料表中插入資料 |
| end loop; |
結束迴圈 |
| dbms_output.put_line('成功錄入資料!'); |
顯示成功錄入資料資訊 |
| commit; |
提交結果 |
| end; |
結束執行 |
表中的sysdate為系統時間函數;dbms_output為系統預設的程式包,put_line為包中定義的方法,功能是輸出資訊;在Oracle中,所有對資料庫資料的更改並沒有直接操作資料庫,而是放在叫工作區的記憶體裡,只有在commit語句執行後,才發生永久更改。
PL/SQL程式結構
結合上述執行個體進行分析,完整的PL/SQL程式結構可以分為3個部分。
1. 定義部分
以Declare為標識,在該部分中定義程式中要使用的常量、變數、遊標和例外處理名稱,PL/SQL程式中使用的所有定義必須在該部分集中定義,而在進階語言裡變數可以在程式執行過程中定義。
2. 執行部分
以begin為開始標識,以end為結束標識。該部分是每個PL/SQL程式所必備的,包含了對資料庫的動作陳述式和各種流程式控制制語句。
3. 異常處理部分
該部分包含在執行部分裡面,以exception為標識,對程式執行中產生的異常情況進行處理。一個完整的PL/SQL程式的總體結構如圖9.5所示。
有的程式比較簡單,往往省略異常處理部分。下面開始介紹PL/SQL的一些基本文法要素。