在定義變量或常量時,必須要指定一個數據類型,PL/SQL是一種靜態類型化的程序設計語言,靜態類型化又稱為強類型化,也就是說類型會在編譯時而不是在運行時被檢查,這樣在編譯時便能發現類型錯誤,以便增強程序的穩定性。
PL/SQL提供多種數據類型,這些類型可以分為如下4大類:
標量類型:用來保存單個值的數據類型,包含字符型、數字型、布爾型和日期型。
復合類型:復合類型是具有內部子組件的類型,可以包含多個標量類型作為其屬性。復合類型包含記錄、嵌套表、索引表和變長數組。
引用類型:引用類型是一個指向不同存儲位置的指針,引用類型包含REF CURSOR和REF這兩種。
LOP類型:LOP類型又稱大對象類型,用來處理二進制和大於4GB的字符串。
1.CHAR
存儲固定的字符數據,CHAR有一個可選的整型值參數用來指定字符的長度,最大32767個字節,CHAR的聲明語法如下:
CHAR[ (maximum_size [CHAR | BYTE] ) ]
maximum_size用於指定字符的長度,其值不能是常量或變量,只能是1~32767之間的整型數字,該參數的默認值為1。
注意:盡管在PL/SQL中可以向CHAR類型指定32767個長度的字符,但是在Oracle數據庫中,CHAR類型字段的最大長度為2000個字節,所以不能往數據庫插入超過2000個字節的字符。
2.VARCHAR2
VARCHAR2變量存儲變長字符串,當定義一個變長字符串時,必須要指定字符串的最大長度,其值范圍為1~32767個字節,在指定長度時也可以選擇性地指定CHAR或BYTE參數,語法如下:
VARCHAR2[ (maximum_size [CHAR | BYTE] ) ]
maximum_size用於指定最大的長度,不能使用常量或變量來指定這個值,必須使用整型數值。與定長的CHAR類型的最大的不同在於實際的基於字節的長度依據實際賦給變量的具體長度而定,這依賴於數據庫的字符集設置,例如Unicode UTF-8字符集使用3個字節表示一個字符。
注意:盡管PL/SQL的VARCHAR2的最大長度為32767字節,但是在數據庫中VARCHAR2數據類型最大為4000字節,因此在PL/SQL塊中為數據庫中的列賦值時要注意大小的限制。
VARCHAR2有兩個字類型:STRING VARCHAR , 它們的功能與VARCHAR2完全相同,完全可以看作是VARCHAR2的一個別名。使用這些字類型來與ANSI/ISO和IBM類型兼容。
目前,VARCHAR和VARCHAR2有着相同的意義,但是在以后的PL/SQL版本中,為了符合SQL標准,VARCHAR有可能會作為一個單獨的類型出現,所以最好使用VARCHAR2,而不是VARCHAR
3.LONG 和LONG RAW
LONG類型和VARCHAR2非常相似,但是LONG類型的最大長度是32760字節,比VARCHAR2少了7個字節。
LONG RAW類型用來存儲二進制數據和字節字符串,LONG RAW數據和LONG數據相似,最大字節也為32760.
Oracle數據庫同樣提供了LONG和LONG RAW列類型,與PL/SQL不同的是,這兩個類型的最大存儲量是2GB,因此可以在PL/SQL中將任何值插入LONG或LONG RAW類型的數據庫中。
注意:在SQL語句中,PL/SQL將LONG類型的值當作VARCHAR2進行處理,而不是LONG類型,如果長度超過VARCHAR2允許的最大長度即4000字節時,Oracle會自動轉換成LONG類型。
由於LONG和LONG RAW是Oracle為了向后兼容性的考慮,因此因該盡量避免在新的開發中使用這兩個數據類型。
4.ROWID和UROWID
每個Oracle數據表都有一個名為ROWID的偽列,這個偽列用來存放每一行數據的存儲地址的二進制值。
每個ROWID值是由18個字符組合進行表示的,ROWID又有物理ROWID和邏輯ROWID之分。物理ROWID用來表示普通數據表中的一行信息,而邏輯ROWID能夠標識索引組織表中的一行信息。ROWID只能存儲物理內容,UROWID或稱通用ROWID類型可以存儲物理、邏輯或非Oracle的ROWID。物理的ROWID可以顯著的加速數據檢索的性能,因為只要行存在,物理ROWID值就不會改變。PL/SQL的ROWID可以借助於ROWIDTOCHAR函數或CHARTOROWID函數來獲取或轉換ROWID信息。
5.NCHAR和NVARCHAR2
這兩個類型是CHAR和VARCHAR2的Unicode版本。
6.NUMBER
NUMBER類型及可以表示整數,亦可以表示浮點數。
NUMBER[ (precision,scale) ]
兩個參數用於聲明精度和刻度
精度:所允許的值的總長度,也就是數值中所有數字位的個數,最大值為38.
刻度:刻度范圍是小數點右邊的數字位的個數,可以是負數,表示由小數點開始向左進行計算數字的個數。
精度和刻度范圍是可選的,如果指定了刻度范圍,那么也必須指定精度。
如果不指定精度和刻度值,則使用最大的精度來聲明NUMBER類型,即默認精度為38.刻度用來確定小數位數,同時確定在什么地方那個進行舍入,范圍在 -84~127之間,如果被指派的值超過了指定的刻度范圍,則存儲值會按照刻度指定的位數進行四舍五入。
NUMBER類型具有幾個字類型,用來與ANSI/ISO或IBM類型相兼容,字類型是可選的類型候選名,可以用來限制字類型變量的合法取值。NUMBER類型有好幾種等價的字類型,可以看作是重命名的NUMBER數據類型:
DEC
DECIMAL
DOUBLE PRECISION
FLOAT
INTEGER
INT
NUMERIC
REAL
SMALLINT
7.PLS_INTEGER和BINARY_INTEGER
PLS_INTEGER和BINARY_INTEGER具有相同的取值范圍,都是從-2147483647~+2147483647,PLS_INTEGER相對於NUMBER來說需要更少的內存空間來存儲數據,而且在計算方面也遠比NUMBER更有效率。
NUMBER數據類型是以十進制格式進行存儲的,為了進行算術運算,NUMBER必須要轉換為二進制類型,因此效率相對來說會比較慢。BINARY_INTEGER以2的補碼二進制形式進行存儲,可以直接進行計算而無需轉換,因此在PL/SQL塊中而非數據庫中的變量用於計算時,使用BINARY_INTEGER可以提供較好的性能。
PLS_INTEGET與BINARY_INTEGER類似,也是使用2的補碼格式進行計算,並且在數字一處時會產生異常。這兩種數據類型的典型區別是:如果在為PLS_INTEGER類型的變量賦值一處時,會觸發異常;而當為BINARY_INTEGER類型的變量賦的值溢出時,會將結果指派為NUMBER類型的擁有最大精度的類型,不會觸發異常。
8.日期和時間類型
DATE
DATE類型用來存儲時間和日期信息,包含世紀、年、月、日、小時、分鍾、秒,但是不包含秒的小數部分。DATE類型從世紀到秒每一部分是一個字節,即占用7個字節。可以使用TO_DATE和TO_CHAR這兩個內置的函數在日期和字符串之間轉換。
DATE類型的有效日期范圍是從公元前4712年1月1號到公元9999年12月31號,默認的日期格式是由Oracle的初始化參數NLS_DATA_FORMAT來設置的。
可以直接對日期運算進行加減運算,這樣返回的是兩個日期之間相關的天數,PL/SQL會將進行運算的整數看作是天數。
SELECT SYSDATE-5 FROM DUAL;
這個查詢將返回5天前的日期。
TIMESTAMP
與DATE不同的是TIMESTAMP它可以存儲秒字段的小數部分。
TIMESTAMP[(P)]
P:是秒字段的小數部分的精度,默認為6.
TIMESTAMP WITH TIME ZONE
TIMESTAMP WITH LOCAL TIME ZONE
INTERVAL
9.布爾類型
Oracle數據庫並不包含布爾類型,多數情況下使用CHAR(1)來代替布爾值,PL/SQL為了結構化程序的需要包含了布爾值,不能往數據庫中插入或者從數據庫中檢索出布爾類型的值。
可以使用BOOLEAN類型來存儲邏輯值True、False和NULL值,布爾值僅用在邏輯操作中,而不能用PL/SQL的布爾值與數據庫交互。
注意:在而布爾值賦True或False時,不需要使用引號,使用引號會將觸發異常。
10.LOB對象類型
LOB類型又稱為大型對象類型,包含了BFILE、BLOB、CLOB和NCLOB等類型,LOB類型最大可存儲4GB的非結構數據,其訪問比對LONG和LONG RAW數據的訪問更有效,它們允許高效地、隨機地分段訪問數據,而且限制要更少。LOB類型通常用來存儲文本、圖像、聲音和視頻等大型數據。
LOB與LONG的區別:
LOB類型可以作為對象類型的屬性,但LONG類型不可。
LOB類型最大值是4GB,而LONG只有2GB。
LOB支持隨機訪問數據,當LONG只支持順序訪問。
LOB對象通過定位器來操作數據,因此在LOB類型中一般會包含一個定位器,定位器用來指向LOB數據。比如當使用查詢語句選擇一個BLOB類型的列時,將只有定位器被返回。通過定位器來完成對大型數據對象的操作。
LOB包含的幾種數據類型及其含義如下所示:
BFILE:BFILE用來在數據庫外的操作系統文件中存儲大型的二進制文件,在數據庫中,每一個BFILE存儲着一個文件定位器,用來指向服務器上的大型二進制文件。
BLOB:BLOB類型用來在數據庫內部大型的二進制對象,每一個BLOB變量存儲一個定位器指向一個大型二進制對象,其大小不能超過4GB字節。BLOB可以參與整個事務處理,可以被復制和恢復。一般使用DBMS_LOB來提交和回滾事務。
CLOB:用來在數據庫中存儲大型的字符型數據,其大小也不可超過4GB。
NCLOB:用來在數據庫中存儲大型的NCHAR類型數據,NCLOB可以支持特定長字符集和變長字符集,可以參與事務的處理,可以被恢復和復制。
注意:從Oracle 9i 開始,可以將CLOB轉換成CHAR和VARCHAR2類型。可以將BLOB轉換成RAW類型,可以使用DBMS_LOB包來讀取和寫入LOB數據。