在本章中,我們將討論和學(xué)習(xí)PL/SQL中的數(shù)據(jù)類型。 PL/SQL變量,常量和參數(shù)必須具有有效的數(shù)據(jù)類型,它指定存儲格式,約束和有效的值范圍。本節(jié)將重點介紹SCALAR和LOB數(shù)據(jù)類型。其他兩個數(shù)據(jù)類型(復(fù)合類型和引用類型)將在后面的章節(jié)中介紹。
PL/SQL標量數(shù)據(jù)類型和子類型分為以下幾類:
序號 | 類型 | 描述 |
---|---|---|
1 | 數(shù)字 | 執(zhí)行算術(shù)運算的數(shù)值。 |
2 | 字符 | 表示單個字符或字符串的字母數(shù)字值。 |
3 | 布爾 | 執(zhí)行邏輯運算的邏輯值。 |
4 | 日期時間 | 用于表示日期和時間的值 |
PL/SQL提供了數(shù)據(jù)類型的子類型。例如,NUMBER數(shù)據(jù)類型具有一個叫作INTEGER的子類型。 您可以使用PL/SQL程序中的子類型將數(shù)據(jù)類型與其他程序中的數(shù)據(jù)類型兼容,同時將PL/SQL代碼嵌入到另一個程序(如Java程序)中。
下表列出了PL/SQL預(yù)定義的數(shù)字數(shù)據(jù)類型及其子類型 -
序號 | 類型 | 描述 |
---|---|---|
1 | PLS_INTEGER |
帶符號整數(shù):-2,147,483,648 至2,147,483,647 ,以32 位表示 |
2 | BINARY_INTEGER |
帶符號整數(shù):-2,147,483,648 至2,147,483,647 ,以32 位表示 |
3 | BINARY_FLOAT |
單精度IEEE 754 格式浮點數(shù) |
4 | BINARY_DOUBLE |
雙精度IEEE 754 格式浮點數(shù) |
5 | NUMBER(prec, scale) |
在1E-130 到(但不包括)1.0E126 范圍內(nèi)的絕對值的定點或浮點數(shù)。NUMBER 變量也可以表示0 |
6 | DEC(prec, scale) |
ANSI特定定點類型,最大精度為38 位十進制數(shù)字 |
7 | DECIMAL(prec, scale) |
IBM具體定點類型,最大精度為38 位十進制數(shù)字 |
8 | NUMERIC(pre, secale) |
浮點型,最大精度為38 位十進制數(shù) |
9 | DOUBLE PRECISION |
ANSI特定浮點類型,最大精度為126 位二進制數(shù)字(大約38位十進制數(shù)字) |
10 | FLOAT |
ANSI和IBM特定浮點類型,最大精度為126 位二進制數(shù)字(大約38 位十進制數(shù)字) |
11 | INT |
ANSI特定整數(shù)類型,最大精度為38 位十進制數(shù) |
12 | INTEGER |
ANSI和IBM特定整數(shù)類型,最大精度為38 位十進制數(shù) |
13 | SMALLINT |
ANSI和IBM特定整數(shù)類型,最大精度為38 位十進制數(shù) |
14 | REAL |
浮點型,最大精度為63 位二進制數(shù)字(約十八位數(shù)) |
以下是有效的聲明 -
DECLARE
num1 INTEGER;
num2 REAL;
num3 DOUBLE PRECISION;
BEGIN
null;
END;
/
SQL
當(dāng)上述代碼編譯和執(zhí)行時,它產(chǎn)生以下結(jié)果 -
PL/SQL procedure successfully completed
Shell
以下是PL/SQL預(yù)定義字符數(shù)據(jù)類型及其子類型的詳細信息 -
序號 | 類型 | 描述 |
---|---|---|
1 | CHAR |
固定長度字符串,最大大小為32,767 字節(jié) |
2 | VARCHAR2 |
最大大小為32,767 字節(jié)的可變長度字符串 |
3 | RAW |
最大大小為32,767 字節(jié)的可變長度二進制或字節(jié)字符串,不由PL/SQL解釋 |
4 | NCHAR |
固定長度的國家字符串,最大大小為32,767 字節(jié) |
5 | NVARCHAR2 |
可變長度的國家字符串,最大大小為32,767 字節(jié) |
6 | LONG |
最大長度為32,760 字節(jié)的可變長度字符串 |
7 | LONG RAW |
最大大小為32,760 字節(jié)的可變長度二進制或字節(jié)字符串,不由PL/SQL解釋 |
8 | ROWID |
物理行標識符,普通表中的行的地址 |
9 | UROWID |
通用行標識符(物理,邏輯或外部行標識符) |
BOOLEAN數(shù)據(jù)類型存儲邏輯運算中使用的邏輯值。邏輯值為布爾值:TRUE,FALSE以及NULL值。
但是,SQL沒有類似于BOOLEAN的數(shù)據(jù)類型。 因此,布爾值不能用于 -
DATE數(shù)據(jù)類型用于存儲固定長度的數(shù)據(jù)日期時間,其包括自午夜以來以秒為單位的時間。 有效期為公元前4712年1月1日至公元9999年12月31日。
默認日期格式由Oracle初始化參數(shù)NLS_DATE_FORMAT設(shè)置。 例如,默認值可能是“DD-MON-YY”,其中包括一個月份的兩位數(shù)字,月份名稱的縮寫以及年份的最后兩位數(shù)字。 例如,01-OCT-12。
每個DATE類型的數(shù)據(jù)值包括世紀,年,月,日,時,分,秒。下表顯示每個字段的有效值 -
字段名 | 有效的日期時間值 | 有效間隔值 |
---|---|---|
YEAR |
-4712 至9999 (不包括第0 年) |
任意非零整數(shù) |
MONTH |
01 ~ 12 |
01 ~ 11 |
DAY |
01 至31 (限于MONTH 和YEAR 的值,根據(jù)本地日歷的規(guī)則) |
任何非零整數(shù) |
HOUR |
00 ~ 23 |
00 ~ 23 |
MINUTE |
00 ~ 59 |
00 ~ 59 |
SECOND |
00 ~ 59.9(n) ,其中9(n) 是時間分秒的精度 |
00 ~ 59.9(n) ,其中9(n) 是間隔分數(shù)秒的精度 |
TIMEZONE_HOUR |
-12 至14 (范圍適應(yīng)夏令時更改) |
不適用 |
TIMEZONE_MINUTE |
00 ~ 59 |
不適用 |
TIMEZONE_REGION |
在動態(tài)性能視圖V$TIMEZONE_NAMES 找到 |
不適用 |
TIMEZONE_ABBR |
在動態(tài)性能視圖V$TIMEZONE_NAMES 找到 |
不適用 |
大對象(LOB)數(shù)據(jù)類型指的是大數(shù)據(jù)項,如文本,圖形圖像,視頻剪輯和聲音波形。 LOB數(shù)據(jù)類型允許對數(shù)據(jù)進行高效,隨機,分段訪問。以下是預(yù)定義的PL/SQL LOB數(shù)據(jù)類型 -
數(shù)據(jù)類型 | 描述 | 大小 |
---|---|---|
BFILE |
用于在數(shù)據(jù)庫外的操作系統(tǒng)文件中存儲大型二進制對象。 | 取決于系統(tǒng),但不得超過4GB 。 |
BLOB |
用于在數(shù)據(jù)庫中存儲的大型二進制對象 | 8TB 至128TB |
CLOB |
用于在數(shù)據(jù)庫中存儲大字符數(shù)據(jù)。 | 8TB 至128TB |
NCLOB |
用于在數(shù)據(jù)庫中存儲大塊NCHAR 數(shù)據(jù)。 |
8TB 至128TB |
子類型是另一種數(shù)據(jù)類型的子集,它稱為基本類型。子類型具有與其基本類型相同的操作,但只有基本類型有效值的子集。
PL/SQL預(yù)定義包STANDARD中的幾個子類型。 例如,PL/SQL預(yù)先定義子類型CHARACTER和INTEGER,如下所示:
SUBTYPE CHARACTER IS CHAR;
SUBTYPE INTEGER IS NUMBER(38,0);
SQL
可以定義和使用自己的子類型。以下程序說明了如何定義和使用用戶定義的子類型 -
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
當(dāng)上述代碼在SQL提示符下執(zhí)行時,它會產(chǎn)生以下結(jié)果 -
Hello Reader Welcome to the World of PL/SQL
PL/SQL procedure successfully completed.
SQL
PL/SQL中的NULL值表示丟失或未知數(shù)據(jù),它們不是整數(shù),字符或任何其他特定數(shù)據(jù)類型。 請注意,NULL與空數(shù)據(jù)字符串或空字符值\0不同??梢詫⒁粋€null值分配給其它變量,但不能等同于任何東西,包括其自身(null)。
更多建議: