常量
1. 定義常量的文法格式
常量名 constant 類型標識符 [not null]:=值;
常量,包括後面的變數名都必須以字母開頭,不能有空格,不能超過30個字元長度,同時不能和保留字同名,常(變)量名稱不區分大小寫,在字母后面可以帶數字或特殊字元。括弧內的not null為選擇性參數,若選用,表明該常(變)量不可為空值。
2. 執行個體
在【SQLPlus Worksheet】中執行下列PL/SQL程式,該程式定義了名為pi的數字型常量,長度為9。
執行結果如圖9.6所示。
―――――――――――――――――――――――――――――――――――――
declare
pi constant number(9):=3.1415926;
begin
commit;
end;
―――――――――――――――――――――――――――――――――――――
【配套程式位置】:第9章\constantdefine.sql。
基礎資料型別 (Elementary Data Type)變數
1. 基礎資料型別 (Elementary Data Type)
PL/SQL中常用的基礎資料型別 (Elementary Data Type)如表9.2所示。
表9.2 常見的資料基本類型
| 類型標識符 |
說明 |
| Number |
數字型 |
| Int |
整數型 |
| Pls_integer |
整數型,產生溢出時出現錯誤 |
| Binary_integer |
整數型,表示帶符號的整數 |
| Char |
定長字元型,最大255個字元 |
| Varchar2 |
變長字元型,最大2000個字元 |
| Long |
變長字元型,最長2GB |
| Date |
日期型 |
| Boolean |
布爾型(TRUE、FALSE、NULL三者取一) |
在PL/SQL中使用的資料類型和Oracle資料庫中使用的資料類型,有的含義是完全一致的,有的是有不同的含義的。
2. 基礎資料型別 (Elementary Data Type)變數的定義方法
變數名 類型標識符 [not null]:=值;
3. 執行個體
在【SQLPlus Worksheet】中執行下列PL/SQL程式,該程式定義了名為age的數字型變數,長度為3,初始值為26。執行結果如圖9.7所示。
―――――――――――――――――――――――――――――――――――――
declare
age number(3):=26;
begin
commit;
end;
―――――――――――――――――――――――――――――――――――――
【配套程式位置】:第9章\basicdatatypedefine.sql。
複合資料型別變數
下面介紹常見的幾種複合資料型別變數的定義。
1. 使用%type定義變數
為了讓PL/SQL中變數的類型和資料表中的欄位的資料類型一致,Oracle 9i提供了%type定義方法。這樣當資料表的欄位類型修改後,PL/SQL程式中相應變數的類型也自動修改。
在【SQLPlus Worksheet】中執行下列PL/SQL程式,該程式定義了名為mydate的變數,其類型和tempuser.testtable資料表中的currentdate欄位類型是一致的。
執行結果如圖9.8所示。
―――――――――――――――――――――――――――――――――――――
Declare
mydate tempuser.testtable.currentdate%type;
begin
commit;
end;
―――――――――――――――――――――――――――――――――――――
【配套程式位置】:第9章\typedefine.sql。
2. 定義記錄類型變數
很多結構化程式設計語言都提供了記錄類型的資料類型,在PL/SQL中,也支援將多個基礎資料型別 (Elementary Data Type)捆綁在一起的記錄資料類型。
下面的程式碼定義了名為myrecord的記錄類型,該記錄類型由整數型的myrecordnumber和日期型的mycurrentdate基本類型變數組成,srecord是該類型的變數,引用記錄型變數的方法是“記錄變數名.基本類型變數名”。
程式的執行部分從tempuser.testtable資料表中提取recordnumber欄位為68的記錄的內容,存放在srecord複合變數裡,然後輸出srecord.mycurrentdate的值,實際上就是資料表中相應記錄的currentdate的值。
在【SQLPlus Worksheet】中執行下列PL/SQL程式,執行結果如圖9.9所示。
―――――――――――――――――――――――――――――――――――――
set serveroutput on
declare
type myrecord is record(
myrecordnumber int,
mycurrentdate date);
srecord myrecord;
begin
select * into srecord from tempuser.testtable where recordnumber=68;
dbms_output.put_line(srecord.mycurrentdate);
end;
―――――――――――――――――――――――――――――――――――――
【配套程式位置】:第9章\ recordtypedefine.sql。
在PL/SQL程式中,select語句總是和into配合使用,into子句後面就是要被賦值的變數。
3. 使用%rowtype定義變數
使用%type可以使變數獲得欄位的資料類型,使用%rowtype可以使變數獲得整個記錄的資料類型。比較兩者定義的不同:變數名 資料表.列名%type,變數名 資料表%rowtype。
在【SQLPlus Worksheet】中執行下列PL/SQL程式,該程式定義了名為mytable的複合類型變數,與testtable資料表結構相同,執行結果如圖9.10所示。
―――――――――――――――――――――――――――――――――――――
Declare
mytable testtable%rowtype;
begin
select * into mytable
from tempuser.testtable
where recordnumber=88;
dbms_output.put_line(mytable.currentdate);
end;
―――――――――――――――――――――――――――――――――――――
【配套程式位置】:第9章\ rowtypedefine.sql。
4. 定義一維表類型變數
表類型變數和資料表是有區別的,定義表類型變數的文法如下:
―――――――――――――――――――――――――――――――――――――
type 表類型 is table of 類型 index by binary_integer;
表變數名 表類型;
―――――――――――――――――――――――――――――――――――――
類型可以是前面的類型定義,index by binary_integer子句代表以符號整數為索引,這樣訪問表類型變數中的資料方法就是“表變數名(索引符號整數)”。
在【SQLPlus Worksheet】中執行下列PL/SQL程式,該程式定義了名為tabletype1和tabletype2的兩個一維表類型,相當於一維數組。table1和table2分別是兩種表類型變數。
執行結果如圖9.11所示。
―――――――――――――――――――――――――――――――――――――
Declare
type tabletype1 is table of varchar2(4) index by binary_integer;
type tabletype2 is table of tempuser.testtable.recordnumber%type index by binary_integer;
table1 tabletype1;
table2 tabletype2;
begin
table1(1):='大學';
table1(2):='大專';
table2(1):=88;
table2(2):=55;
dbms_output.put_line(table1(1)||table2(1));
dbms_output.put_line(table1(2)||table2(2));
end;
―――――――――――――――――――――――――――――――――――――
【配套程式位置】:第9章\ tabletypedefine1.sql。
“||”是連接字串的運算子。
5. 定義多維表類型變數
在【SQLPlus Worksheet】中執行下列PL/SQL程式,該程式定義了名為tabletype1的多維表類型,相當於多維陣列,table1是多維表類型變數,將資料表tempuser.testtable中recordnumber為60的記錄提取出來存放在table1中並顯示。執行結果如圖9.12所示。
―――――――――――――――――――――――――――――――――――――
Declare
type tabletype1 is table of testtable%rowtype index by binary_integer;
table1 tabletype1;
begin
select * into table1(60)
from tempuser.testtable
where recordnumber=60;
dbms_output.put_line(table1(60).recordnumber||table1(60).currentdate);
end;
―――――――――――――――――――――――――――――――――――――
【配套程式位置】:第9章\ tabletypedefine2.sql。
在定義好的表類型變數裡,可以使用count、delete、first、last、next、exists和prior等屬性進行操作,使用方法為“表變數名.屬性”,返回的是數字。
在【SQLPlus Worksheet】中執行下列PL/SQL程式,該程式定義了名為tabletype1的一維表類型,table1是一維表類型變數,變數中插入3個資料,綜合使用了表變數屬性。
執行結果如圖9.13所示。
―――――――――――――――――――――――――――――――――――――
set serveroutput on
Declare
type tabletype1 is table of varchar2(9) index by binary_integer;
table1 tabletype1;
begin
table1(1):='成都市';
table1(2):='北京市';
table1(3):='青島市';
dbms_output.put_line('總記錄數:'||to_char(table1.count));
dbms_output.put_line('第一條記錄:'||table1.first);
dbms_output.put_line('最後條記錄:'||table1.last);
dbms_output.put_line('第二條的前一條記錄:'||table1.prior(2));
dbms_output.put_line('第二條的後一條記錄:'||table1.next(2));
end;
―――――――――――――――――――――――――――――――――――――
【配套程式位置】:第9章\ tabletypedefine3.sql。
運算式
變數、常量經常需要組成各種運算式來進行運算,下面介紹在PL/SQL中常見運算式的運算規則。
1. 數值運算式
PL/SQL程式中的數值運算式是由數值型常數、變數、函數和算術運算子組成的,可以使用的算術運算子包括+(加法)、-(減法)、*(乘法)、/(除法)和**(乘方)等。
在【SQLPlus Worksheet】中執行下列PL/SQL程式,該程式定義了名為result的整數型變數,計算的是10+3*4-20+5**2的值,理論結果應該是27。執行結果如圖9.14所示。
―――――――――――――――――――――――――――――――――――――
set serveroutput on
Declare
result integer;
begin
result:=10+3*4-20+5**2;
dbms_output.put_line('運算結果是:'||to_char(result));
end;
―――――――――――――――――――――――――――――――――――――
【配套程式位置】:第9章\ datacompute.sql。
dbms_output.put_line函數輸出只能是字串,因此利用to_char函數將數值型結果轉換為字元型。
2. 字元運算式
字元運算式由字元型常數、變數、函數和字元運算子組成,唯一可以使用的字元運算子就是串連運算子“||”。
3. 關聯運算式
關聯運算式由字元運算式或數值運算式與關係運算子組成,可以使用的關係運算子包括以下9種。
< 小於
> 大於
= 等於(不是賦值運算子:=)
like 類似於
in 在……之中
<= 小於等於
>= 大於等於
!= 不等於
between 在……之間
關係型運算式運算子兩邊的運算式的資料類型必須一致。
4. 邏輯運算式
邏輯運算式由邏輯常數、變數、函數和邏輯運算子組成,常見的邏輯運算子包括以下3種。
NOT:邏輯非
OR:邏輯或
AND:邏輯與
運算的優先次序為NOT、AND和OR。
函數
PL/SQL程式中提供了很多函數供擴充功能,除了標準SQL語言的函數可以使用外,最常見的資料類型轉換函式有以下3個。
To_char:將其他類型資料轉換為字元型。
To_date:將其他類型資料轉換為日期型。
To_number:將其他類型資料轉換為數值型。
以上介紹了PL/SQL中最基本的文法要素,下面介紹體現PL/SQL過程化編程思想的流程式控制制語句。