PL/SQL數據類型
PL/SQL變量,常量和參數都必須有一個有效的數據類型,指定存儲格式,約束和值的有效範圍。本教學介紹標量和LOB在PL/SQL,其他兩種數據類型可用的數據類型將涵蓋在後麵的章節。
分類 | 描述 |
---|---|
標量 | 單值冇有內部組件,如NUMBER, DATE 或 BOOLEAN |
大對象(LOB) | 指向其他數據項,如文本,圖形圖像,視頻剪輯和聲音等存儲大對象 |
複合 | 具有可單獨訪問的內部組件的數據項。例如,集合和記錄 |
引用 | 指向其他數據項 |
PL/SQL標量數據類型和子類型
PL/SQL標量數據類型和子類型受到以下幾大類:
數據類型 | 描述 |
---|---|
數字 | 在其上執行的算術運算的數值 |
字符 | 代表單個字符或字符的字母數字字符串值 |
布爾 | 在其上執行的邏輯運算的邏輯值 |
日期時間 | 日期和時間 |
PL/SQL提供的數據類型的子類型。例如,數據類型數有一個叫作INTEGER的子類型。可以使用子類型在PL/SQL程序中,使數據類型與其他程序中的數據類型兼容,而嵌入PL/SQL代碼在另一個程序,如Java程序。
PL/SQL數值數據類型和子類型
以下是PL/ SQL預定義的數字數據類型及其子類型的詳細信息:
數據類型 | 描述 |
---|---|
PLS_INTEGER | 通過2,147,483,647到-2147483648範圍內有符號整數,以32位表示 |
BINARY_INTEGER | 通過2,147,483,647到-2147483648範圍內的有符號整數,以32位表示 |
BINARY_FLOAT | 單精度IEEE 754格式的浮點數 |
BINARY_DOUBLE | 雙精度IEEE 754格式的浮點數 |
NUMBER(prec, scale) | 定點或浮點數在範圍1E-130至(但不包括)絕對值1.0E126。 NUMBER變量也可以表示0 |
DEC(prec, scale) | ANSI具體的定點類型使用38位小數最大精度 |
DECIMAL(prec, scale) | IBM特定的固定點型具有38位小數最大精度 |
NUMERIC(pre, secale) | 浮點類型具有38位小數最大精度。 |
DOUBLE PRECISION | 具有126個二進製數字最大精度ANSI特定浮點型(約38位十進製數) |
FLOAT | 具有126個二進製數字(約38位十進製數)最大精度ANSI和IBM特定的浮點型 |
INT | 具有38位小數最大精度ANSI具體的整數類型 |
INTEGER | ANSI和IBM的38位小數最大精度具體的整數類型 |
SMALLINT | ANSI和IBM的38位小數最大精度具體的整數類型 |
REAL | 具有63位二進製數字最大精度浮點型(大約18位小數) |
下麵是一個有效的聲明:
DECLARE num1 INTEGER; num2 REAL; num3 DOUBLE PRECISION; BEGIN null; END; /
讓我們編譯和運行上麵的程序,這將產生以下結果:
PL/SQL procedure successfully completed
PL/SQL字符數據類型和子類型
以下是PL/SQL預定義的字符數據類型及其子類型的詳細信息:
數據類型 | 描述 |
---|---|
CHAR | 具有32,767個字節的最大尺寸固定長度字符串 |
VARCHAR2 | 具有32,767個字節的最大尺寸變長字符串 |
RAW | 可變長度的二進製或字節字符串的32,767個字節的最大尺寸,而不是由PL/ SQL解釋 |
NCHAR | 具有32,767個字節的最大尺寸的固定長度國家字符串 |
NVARCHAR2 | 具有32,767個字節的最大尺寸可變長度國家字符串 |
LONG | 具有32,760字節最大尺寸變長字符串 |
LONG RAW | 可變長度的二進製或字節字符串的32,760字節的最大尺寸,而不是由PL/SQL解釋 |
ROWID | 物理行標識符,一行在一個普通的表中的地址 |
UROWID | 物理通用行標識符(物理,邏輯,或外國的行標識符) |
PL/SQL布爾數據類型
在邏輯操作中使用布爾數據類型存儲的邏輯值。邏輯值為:true 和 false 的布爾值以及 NULL 值。
但是,SQL冇有數據類型等同於布爾。因此,布爾值不能用於:
-
SQL語句
-
內置SQL函數(如TO_CHAR)
-
從SQL語句調用PL/ SQL函數
PL/SQL日期時間和間隔類型
DATE數據類型存儲固定長度的日期時間,其中包括每天在幾秒鐘內從午夜開始的時間。有效的日期範圍從公元前4712年1月1日至999912月31日。
默認的日期格式由Oracle初始化參數NLS_DATE_FORMAT設置。例如,默認的可以是“DD-MON-YY',它包括一個兩位數字的月份中的日期,月份名稱的縮寫,以及年的最後兩位數字,例如,01- OCT-12。
每個日期,包括世紀,年,月,日,時,分,秒。下表顯示了每個字段的有效值:
字段名稱 | 有效日期時間值 | 有效的間隔值 |
---|---|---|
YEAR | -4712 to 9999 (年除外 0) | 任何非零整數 |
MONTH | 01 to 12 | 0 to 11 |
DAY | 01 to 31 (受製於年份和月份的數值,按日曆的區域設置的規則) | 任何非零整數 |
HOUR | 00 to 23 | 0 to 23 |
MINUTE | 00 to 59 | 0 to 59 |
SECOND | 00 to 59.9(n), 其中,9(n)是時間小數秒精度 | 0 to 59.9(n), 其中,9(n)是區間小數秒精度 |
TIMEZONE_HOUR | -12 to 14 (範圍可容納夏令時更改) | 不適用 |
TIMEZONE_MINUTE | 00 to 59 | 不適用 |
TIMEZONE_REGION | 在動態性能視圖找到V$TIMEZONE_NAMES | 不適用 |
TIMEZONE_ABBR | 在動態性能視圖找到V$TIMEZONE_NAMES | 不適用 |
PL/SQL大對象(LOB)數據類型
大對象(LOB)數據類型是指大到數據項,例如文本,圖形圖像,視頻剪輯和聲音波形。 LOB數據類型允許高效的,隨機的,分段訪問這些數據。以下是預定義的PL/SQL LOB數據類型:
數據類型 | 描述 | 大小 |
---|---|---|
BFILE | 用於存儲大型二進製對象在操作數據庫之外的係統文件 | 依賴於係統,不能超過4千兆字節(GB) |
BLOB | 用於存儲大型二進製對象在數據庫中 | 8到128兆兆字節(TB)的 |
CLOB | 用於存儲字符大塊數據在數據庫中 | 8 - 128 TB |
NCLOB | 用於在數據庫中存儲大塊NCHAR數據 | 8 - 128 TB |
PL/SQL用戶定義的子類型
子類型是另一種數據類型,這是所謂的基本類型的子集。 子類型具有其基本類型相同的操作,但其隻是有效值的一個子集。
PL/SQL預定義了一些子類型的封裝標準。例如,PL/SQL預定義的子類型CHARACTER和INTEGER如下:
SUBTYPE CHARACTER IS CHAR; SUBTYPE INTEGER IS NUMBER(38,0);
可以定義和使用自己的子類型。下麵的程序說明定義和使用一個用戶定義的子類型:
DECLARE SUBTYPE name IS char(20); SUBTYPE message IS varchar2(100); salutation name; greetings message; BEGIN salutation := 'Reader '; greetings := 'Welcome to the World of PL/SQL'; dbms_output.put_line('Hello ' || salutation || greetings); END; /
當上述代碼在SQL提示符執行時,它產生了以下結果:
Hello Reader Welcome to the World of PL/SQL PL/SQL procedure successfully completed.
PL/SQL NULL
PL/SQL NULL值表示缺少或未知的數據,蛤它不是一個整數,字符,或任何其他特定的數據類型。需要注意的是NULL不是一樣的空數據串或空字符值'\0'。NULL可以被分配,但它不能與任何東西等同,包括其本身。