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