PL/SQL數據類型

在本章中,我們將討論和學習PL/SQL中的數據類型。 PL/SQL變數,常量和參數必須具有有效的數據類型,它指定存儲格式,約束和有效的值範圍。本節將重點介紹SCALARLOB數據類型。其他兩個數據類型(複合類型和引用類型)將在後面的章節仲介紹。

  • 標量(SCALAR)類型 - 它是沒有內部組件的單個值,例如:NUMBERDATEBOOLEAN等。
  • 大對象(LOB)類型 - 指向與其他資料項目(例如:文本,圖形圖像,視頻剪輯和聲音波形)分開存儲的大對象的指針。
  • 複合類型 - 具有可單獨訪問的內部組件的資料項目。例如,集合和記錄。
  • 引用類型 - 指向其他資料項目。

PL/SQL標量數據類型和子類型

PL/SQL標量數據類型和子類型分為以下幾類:

序號 類型 描述
1 數字 執行算術運算的數值。
2 字元 表示單個字元或字串的字母數字值。
3 布爾 執行邏輯運算的邏輯值。
4 日期時間 用於表示日期和時間的值

PL/SQL提供了數據類型的子類型。例如,NUMBER數據類型具有一個叫作INTEGER的子類型。 您可以使用PL/SQL程式中的子類型將數據類型與其他程式中的數據類型相容,同時將PL/SQL代碼嵌入到另一個程式(如Java程式)中。

PL/SQL數值數據類型和子類型

下表列出了PL/SQL預定義的數字數據類型及其子類型 -

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

以下是有效的聲明 -

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

當上述代碼編譯和執行時,它產生以下結果 -

PL/SQL procedure successfully completed

PL/SQL字元數據類型和子類型

以下是PL/SQL預定義字元數據類型及其子類型的詳細資訊 -

序號 類型 描述
1 CHAR 固定長度字串,最大大小為32,767位元組
2 VARCHAR2 最大大小為32,767位元組的可變長度字串
3 RAW 最大大小為32,767位元組的可變長度二進位或位元組字串,不由PL/SQL解釋
4 NCHAR 固定長度的國家字串,最大大小為32,767位元組
5 NVARCHAR2 可變長度的國家字串,最大大小為32,767位元組
6 LONG 最大長度為32,760位元組的可變長度字串
7 LONG RAW 最大大小為32,760位元組的可變長度二進位或位元組字串,不由PL/SQL解釋
8 ROWID 物理行識別字,普通表中的行的地址
9 UROWID 通用行識別字(物理,邏輯或外部行識別字)

PL/SQL布爾數據類型

BOOLEAN數據類型存儲邏輯運算中使用的邏輯值。邏輯值為布爾值:TRUE,FALSE以及NULL值。

但是,SQL沒有類似於BOOLEAN的數據類型。 因此,布爾值不能用於 -

  • SQL語句
  • 內置SQL函數(如:TO_CHAR)
  • 從SQL語句調用PL/SQL函數

PL/SQL日期時間和間隔類型

DATE數據類型用於存儲固定長度的數據日期時間,其包括自午夜以來以秒為單位的時間。 有效期為西元前4712年1月1日至西元9999年12月31日。

默認日期格式由Oracle初始化參數NLS_DATE_FORMAT設置。 例如,默認值可能是“DD-MON-YY”,其中包括一個月份的兩位數字,月份名稱的縮寫以及年份的最後兩位數字。 例如,01-OCT-12

每個DATE類型的數據值包括世紀,年,月,日,時,分,秒。下表顯示每個字段的有效值 -

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

PL/SQL大對象(LOB)數據類型

大對象(LOB)數據類型指的是大數據項,如文本,圖形圖像,視頻剪輯和聲音波形。 LOB數據類型允許對數據進行高效,隨機,分段訪問。以下是預定義的PL/SQL LOB數據類型 -

數據類型 描述 大小
BFILE 用於在資料庫外的操作系統檔中存儲大型二進位對象。 取決於系統,但不得超過4GB
BLOB 用於在資料庫中存儲的大型二進位對象 8TB128TB
CLOB 用於在資料庫中存儲大字符數據。 8TB128TB
NCLOB 用於在資料庫中存儲大塊NCHAR數據。 8TB128TB

PL/SQL用戶定義的子類型

子類型是另一種數據類型的子集,它稱為基本類型。子類型具有與其基本類型相同的操作,但只有基本類型有效值的子集。

PL/SQL預定義包STANDARD中的幾個子類型。 例如,PL/SQL預先定義子類型CHARACTERINTEGER,如下所示:

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值分配給其他變數,但不能等同於任何東西,包括其自身(null)。


上一篇: PL/SQL基本語法 下一篇: PL/SQL變數