
- PL/SQL 教程
- PL/SQL - 首頁
- PL/SQL - 概述
- PL/SQL - 環境
- PL/SQL - 基本語法
- PL/SQL - 資料型別
- PL/SQL - 變數
- PL/SQL - 常量和字面量
- PL/SQL - 運算子
- PL/SQL - 條件
- PL/SQL - 迴圈
- PL/SQL - 字串
- PL/SQL - 陣列
- PL/SQL - 過程
- PL/SQL - 函式
- PL/SQL - 遊標
- PL/SQL - 記錄
- PL/SQL - 異常
- PL/SQL - 觸發器
- PL/SQL - 包
- PL/SQL - 集合
- PL/SQL - 事務
- PL/SQL - 日期和時間
- PL/SQL - DBMS 輸出
- PL/SQL - 面向物件
- PL/SQL 有用資源
- PL/SQL - 問題和解答
- PL/SQL - 快速指南
- PL/SQL - 有用資源
- PL/SQL - 討論
PL/SQL - 資料型別
在本章中,我們將討論 PL/SQL 中的資料型別。PL/SQL 變數、常量和引數必須具有有效的資料型別,該型別指定儲存格式、約束和有效值範圍。本章將重點介紹 **標量** 和 **LOB** 資料型別。其他兩種資料型別將在其他章節中介紹。
序號 | 類別和描述 |
---|---|
1 | 標量 沒有內部元件的單個值,例如 **NUMBER**、**DATE** 或 **BOOLEAN**。 |
2 | 大型物件 (LOB) 指向儲存在其他資料項之外的大型物件的指標,例如文字、圖形影像、影片剪輯和聲音波形。 |
3 | 複合 具有可以單獨訪問的內部元件的資料項。例如,集合和記錄。 |
4 | 引用 指向其他資料項的指標。 |
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,648 到 2,147,483,647 的帶符號整數,以 32 位表示 |
2 | BINARY_INTEGER 範圍為 -2,147,483,648 到 2,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 位二進位制數字(大約 18 位小數) |
以下是一個有效的宣告:
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 | -4712 到 9999(不包括年份 0) | 任何非零整數 |
MONTH | 01 到 12 | 0 到 11 |
DAY | 01 到 31(受月份和年份的值限制,根據區域設定的日曆規則) | 任何非零整數 |
HOUR | 00 到 23 | 0 到 23 |
MINUTE | 00 到 59 | 0 到 59 |
SECOND | 00 到 59.9(n),其中 9(n) 是時間小數秒的精度 | 0 到 59.9(n),其中 9(n) 是間隔小數秒的精度 |
TIMEZONE_HOUR | -12 到 14(範圍適應夏令時變化) | 不適用 |
TIMEZONE_MINUTE | 00 到 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 在包 **STANDARD** 中預定義了幾個子型別。例如,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,但不能將其與任何內容等同,包括自身。