1. 程式人生 > >2、PL/SQL資料型別

2、PL/SQL資料型別

 PL/SQL變數,常量和引數必須具有有效的資料型別,它指定儲存格式,約束和有效的值範圍。

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

PL/SQL標量資料型別和子型別

PL/SQL標量資料型別和子型別分為以下幾類:

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位二進位制數字(約十八位數)

以下是有效的宣告 -

SQL> declare
  2       num1 integer;
  3       num2 real;
  4       num3 double precision;
  5  begin
  6       null;
  7  end;
  8  /
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);

可以定義和使用自己的子型別。以下程式說明了如何定義和使用使用者定義的子型別 -

SQL> declare
  2       subtype name is char(20);
  3       subtype message is varchar2(100);
  4       salution name;
  5       greeting message;
  6  begin
  7       salution :='Reader';
  8       greeting :='Welcome to the world of PL/SQL';
  9       dbms_output.put_line('Hello' || salution || greeting);
 10  end;
 11  /
HelloReader              Welcome to the world of PL/SQL
PL/SQL procedure successfully completed

PL/SQL中的null

PL/SQL中的NULL值表示丟失或未知資料,它們不是整數,字元或任何其他特定資料型別。 請注意,NULL與空資料字串或空字元值“\0”不同。可以將一個null值分配給其它變數,但不能等同於任何東西,包括其自身(null)。