PL/SQL 數(shù)據(jù)類(lèi)型

2021-08-30 14:37 更新

在本章中,我們將討論和學(xué)習(xí)PL/SQL中的數(shù)據(jù)類(lèi)型。 PL/SQL變量,常量和參數(shù)必須具有有效的數(shù)據(jù)類(lèi)型,它指定存儲(chǔ)格式,約束和有效的值范圍。本節(jié)將重點(diǎn)介紹SCALAR和LOB數(shù)據(jù)類(lèi)型。其他兩個(gè)數(shù)據(jù)類(lèi)型(復(fù)合類(lèi)型和引用類(lèi)型)將在后面的章節(jié)中介紹。

  • 標(biāo)量(SCALAR)類(lèi)型 - 它是沒(méi)有內(nèi)部組件的單個(gè)值,例如:NUMBER,DATE或BOOLEAN等。
  • 大對(duì)象(LOB)類(lèi)型 - 指向與其他數(shù)據(jù)項(xiàng)(例如:文本,圖形圖像,視頻剪輯和聲音波形)分開(kāi)存儲(chǔ)的大對(duì)象的指針。
  • 復(fù)合類(lèi)型 - 具有可單獨(dú)訪問(wèn)的內(nèi)部組件的數(shù)據(jù)項(xiàng)。例如,集合和記錄。
  • 引用類(lèi)型 - 指向其他數(shù)據(jù)項(xiàng)。

PL/SQL標(biāo)量數(shù)據(jù)類(lèi)型和子類(lèi)型

PL/SQL標(biāo)量數(shù)據(jù)類(lèi)型和子類(lèi)型分為以下幾類(lèi):

序號(hào) 類(lèi)型 描述
1 數(shù)字 執(zhí)行算術(shù)運(yùn)算的數(shù)值。
2 字符 表示單個(gè)字符或字符串的字母數(shù)字值。
3 布爾 執(zhí)行邏輯運(yùn)算的邏輯值。
4 日期時(shí)間 用于表示日期和時(shí)間的值

PL/SQL提供了數(shù)據(jù)類(lèi)型的子類(lèi)型。例如,NUMBER數(shù)據(jù)類(lèi)型具有一個(gè)叫作INTEGER的子類(lèi)型。 您可以使用PL/SQL程序中的子類(lèi)型將數(shù)據(jù)類(lèi)型與其他程序中的數(shù)據(jù)類(lèi)型兼容,同時(shí)將PL/SQL代碼嵌入到另一個(gè)程序(如Java程序)中。

PL/SQL數(shù)值數(shù)據(jù)類(lèi)型和子類(lèi)型

下表列出了PL/SQL預(yù)定義的數(shù)字?jǐn)?shù)據(jù)類(lèi)型及其子類(lèi)型 -

序號(hào) 類(lèi)型 描述
1 PLS_INTEGER 帶符號(hào)整數(shù):-2,147,483,6482,147,483,647,以32位表示
2 BINARY_INTEGER 帶符號(hào)整數(shù):-2,147,483,6482,147,483,647,以32位表示
3 BINARY_FLOAT 單精度IEEE 754格式浮點(diǎn)數(shù)
4 BINARY_DOUBLE 雙精度IEEE 754格式浮點(diǎn)數(shù)
5 NUMBER(prec, scale) 1E-130到(但不包括)1.0E126范圍內(nèi)的絕對(duì)值的定點(diǎn)或浮點(diǎn)數(shù)。NUMBER變量也可以表示0
6 DEC(prec, scale) ANSI特定定點(diǎn)類(lèi)型,最大精度為38位十進(jìn)制數(shù)字
7 DECIMAL(prec, scale) IBM具體定點(diǎn)類(lèi)型,最大精度為38位十進(jìn)制數(shù)字
8 NUMERIC(pre, secale) 浮點(diǎn)型,最大精度為38位十進(jìn)制數(shù)
9 DOUBLE PRECISION ANSI特定浮點(diǎn)類(lèi)型,最大精度為126位二進(jìn)制數(shù)字(大約38位十進(jìn)制數(shù)字)
10 FLOAT ANSI和IBM特定浮點(diǎn)類(lèi)型,最大精度為126位二進(jìn)制數(shù)字(大約38位十進(jìn)制數(shù)字)
11 INT ANSI特定整數(shù)類(lèi)型,最大精度為38位十進(jìn)制數(shù)
12 INTEGER ANSI和IBM特定整數(shù)類(lèi)型,最大精度為38位十進(jìn)制數(shù)
13 SMALLINT ANSI和IBM特定整數(shù)類(lèi)型,最大精度為38位十進(jìn)制數(shù)
14 REAL 浮點(diǎn)型,最大精度為63位二進(jìn)制數(shù)字(約十八位數(shù))

以下是有效的聲明 -

DECLARE 
   num1 INTEGER; 
   num2 REAL; 
   num3 DOUBLE PRECISION; 
BEGIN 
   null; 
END; 
/
SQL

當(dāng)上述代碼編譯和執(zhí)行時(shí),它產(chǎn)生以下結(jié)果 -

PL/SQL procedure successfully completed
Shell

PL/SQL字符數(shù)據(jù)類(lèi)型和子類(lèi)型

以下是PL/SQL預(yù)定義字符數(shù)據(jù)類(lèi)型及其子類(lèi)型的詳細(xì)信息 -

序號(hào) 類(lèi)型 描述
1 CHAR 固定長(zhǎng)度字符串,最大大小為32,767字節(jié)
2 VARCHAR2 最大大小為32,767字節(jié)的可變長(zhǎng)度字符串
3 RAW 最大大小為32,767字節(jié)的可變長(zhǎng)度二進(jìn)制或字節(jié)字符串,不由PL/SQL解釋
4 NCHAR 固定長(zhǎng)度的國(guó)家字符串,最大大小為32,767字節(jié)
5 NVARCHAR2 可變長(zhǎng)度的國(guó)家字符串,最大大小為32,767字節(jié)
6 LONG 最大長(zhǎng)度為32,760字節(jié)的可變長(zhǎng)度字符串
7 LONG RAW 最大大小為32,760字節(jié)的可變長(zhǎng)度二進(jìn)制或字節(jié)字符串,不由PL/SQL解釋
8 ROWID 物理行標(biāo)識(shí)符,普通表中的行的地址
9 UROWID 通用行標(biāo)識(shí)符(物理,邏輯或外部行標(biāo)識(shí)符)

PL/SQL布爾數(shù)據(jù)類(lèi)型

BOOLEAN數(shù)據(jù)類(lèi)型存儲(chǔ)邏輯運(yùn)算中使用的邏輯值。邏輯值為布爾值:TRUE,FALSE以及NULL值。

但是,SQL沒(méi)有類(lèi)似于BOOLEAN的數(shù)據(jù)類(lèi)型。 因此,布爾值不能用于 -

  • SQL語(yǔ)句
  • 內(nèi)置SQL函數(shù)(如:TO_CHAR)
  • 從SQL語(yǔ)句調(diào)用PL/SQL函數(shù)

PL/SQL日期時(shí)間和間隔類(lèi)型

DATE數(shù)據(jù)類(lèi)型用于存儲(chǔ)固定長(zhǎng)度的數(shù)據(jù)日期時(shí)間,其包括自午夜以來(lái)以秒為單位的時(shí)間。 有效期為公元前4712年1月1日至公元9999年12月31日。

默認(rèn)日期格式由Oracle初始化參數(shù)NLS_DATE_FORMAT設(shè)置。 例如,默認(rèn)值可能是“DD-MON-YY”,其中包括一個(gè)月份的兩位數(shù)字,月份名稱(chēng)的縮寫(xiě)以及年份的最后兩位數(shù)字。 例如,01-OCT-12。

每個(gè)DATE類(lèi)型的數(shù)據(jù)值包括世紀(jì),年,月,日,時(shí),分,秒。下表顯示每個(gè)字段的有效值 -

字段名 有效的日期時(shí)間值 有效間隔值
YEAR -47129999(不包括第0年) 任意非零整數(shù)
MONTH 01 ~ 12 01 ~ 11
DAY 0131(限于MONTHYEAR的值,根據(jù)本地日歷的規(guī)則) 任何非零整數(shù)
HOUR 00 ~ 23 00 ~ 23
MINUTE 00 ~ 59 00 ~ 59
SECOND 00 ~ 59.9(n),其中9(n)是時(shí)間分秒的精度 00 ~ 59.9(n),其中9(n)是間隔分?jǐn)?shù)秒的精度
TIMEZONE_HOUR -1214(范圍適應(yīng)夏令時(shí)更改) 不適用
TIMEZONE_MINUTE 00 ~ 59 不適用
TIMEZONE_REGION 在動(dòng)態(tài)性能視圖V$TIMEZONE_NAMES找到 不適用
TIMEZONE_ABBR 在動(dòng)態(tài)性能視圖V$TIMEZONE_NAMES找到 不適用

PL/SQL大對(duì)象(LOB)數(shù)據(jù)類(lèi)型

大對(duì)象(LOB)數(shù)據(jù)類(lèi)型指的是大數(shù)據(jù)項(xiàng),如文本,圖形圖像,視頻剪輯和聲音波形。 LOB數(shù)據(jù)類(lèi)型允許對(duì)數(shù)據(jù)進(jìn)行高效,隨機(jī),分段訪問(wèn)。以下是預(yù)定義的PL/SQL LOB數(shù)據(jù)類(lèi)型 -

數(shù)據(jù)類(lèi)型 描述 大小
BFILE 用于在數(shù)據(jù)庫(kù)外的操作系統(tǒng)文件中存儲(chǔ)大型二進(jìn)制對(duì)象。 取決于系統(tǒng),但不得超過(guò)4GB。
BLOB 用于在數(shù)據(jù)庫(kù)中存儲(chǔ)的大型二進(jìn)制對(duì)象 8TB128TB
CLOB 用于在數(shù)據(jù)庫(kù)中存儲(chǔ)大字符數(shù)據(jù)。 8TB128TB
NCLOB 用于在數(shù)據(jù)庫(kù)中存儲(chǔ)大塊NCHAR數(shù)據(jù)。 8TB128TB

PL/SQL用戶(hù)定義的子類(lèi)型

子類(lèi)型是另一種數(shù)據(jù)類(lèi)型的子集,它稱(chēng)為基本類(lèi)型。子類(lèi)型具有與其基本類(lèi)型相同的操作,但只有基本類(lèi)型有效值的子集。

PL/SQL預(yù)定義包STANDARD中的幾個(gè)子類(lèi)型。 例如,PL/SQL預(yù)先定義子類(lèi)型CHARACTER和INTEGER,如下所示:

SUBTYPE CHARACTER IS CHAR; 
SUBTYPE INTEGER IS NUMBER(38,0);
SQL

可以定義和使用自己的子類(lèi)型。以下程序說(shuō)明了如何定義和使用用戶(hù)定義的子類(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; 
/
SQL

當(dāng)上述代碼在SQL提示符下執(zhí)行時(shí),它會(huì)產(chǎn)生以下結(jié)果 -

Hello Reader Welcome to the World of PL/SQL 

PL/SQL procedure successfully completed.
SQL

PL/SQL中的NULL

PL/SQL中的NULL值表示丟失或未知數(shù)據(jù),它們不是整數(shù),字符或任何其他特定數(shù)據(jù)類(lèi)型。 請(qǐng)注意,NULL與空數(shù)據(jù)字符串或空字符值\0不同??梢詫⒁粋€(gè)null值分配給其它變量,但不能等同于任何東西,包括其自身(null)。

 



以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)