全部產品
Search
文件中心

PolarDB:使用者定義的 PL/SQL 子類型

更新時間:Jul 06, 2024

PolarDB PostgreSQL版(相容Oracle)支援使用者定義的PL/SQL子類型和(子類型)別名。子類型是具有一組可選約束的資料類型,這些約束限制可以儲存在該類型的列中的值。適用於該子類型所基於的類型的規則仍然適用,但您可以使用其他約束限制該類型中儲存值的精度或小數位元。

您可以在PL函數、預存程序、匿名塊或包的聲明中定義子類型。文法如下:

SUBTYPE subtype_name IS type_name[(constraint)] [NOT NULL]

其中constraint為:

{precision [, scale]} | length

其中:

  • subtype_name:subtype_name指定子類型的名稱。
  • type_name:type_name指定子類型所基於的原始類型的名稱。

    type_name可能是:

    • PolarDB PostgreSQL版(相容Oracle)支援的任何類型的名稱。
    • 任何複合類型的名稱。
    • 通過%TYPE運算子固定的列。
    • 另一種子類型的名稱。

包括constraint子句以定義支援精度或小數位元的類型的限制。

  • precision:precision指定子類型值中允許的總位元。
  • scale:scale指定子類型值中允許的小數位元。
  • length:length 指定CHARACTER、VARCHAR或TEXT基本類型值中允許的總長度。

包括NOTNULL子句以指定NULL值可不儲存在指定子類型的列中。

請注意,基於列的子類型將繼承列大小約束,但該子類型不會繼承NOT NULL或CHECK約束。

不受約束的子類型

要建立不受約束的子類型,請使用SUBTYPE命令指定新子類型名稱和該子類型所基於類型的名稱。例如,以下命令會建立一個名為address的子類型,該子類型具有類型CHAR的所有屬性:

SUBTYPE address IS CHAR;

您還可以建立另一個子類型的子類型(受約束或不受約束):

SUBTYPE cust_address IS address NOT NULL;

此命令建立名為cust_address的子類型,該子類型共用address子類型的所有屬性。包括NOT NULL子句以指定cust_address的值可能並非NULL。

受約束的子類型

基於字元類型建立子類型時包括length值以定義子類型的最大長度。例如:

SUBTYPE acct_name IS VARCHAR (15);

此樣本基於VARCHAR資料類型建立名為acct_name的子類型,但限制為15個字元長度。

約束數字基本類型時,包括precision(指定子類型值中的最大位元)和可選的scale(指定小數點右側的位元)的值。例如:

SUBTYPE acct_balance IS NUMBER (5, 2);

此樣本建立名為acct_balance的子類型,該子類型共用NUMBER類型的所有屬性,但小數點左側不得超過3位元,小數點右側不得超過2位元。

參數聲明(在函數或預存程序標題中)為形參。傳遞給函數或預存程序的值為實參。調用函數或預存程序時,調用方提供(0個或更多)實參。每個實參都分配給一個形參,該形參將值儲存在函數或預存程序的主體內。

如果將形參聲明為受約束的子類型:

  • 調用函數時,如果將實參分配給形參,則PolarDB PostgreSQL版(相容Oracle)不會實施子類型約束。
  • 調用過程時,如果將實參分配給形參,則PolarDB PostgreSQL版(相容Oracle)會實施子類型約束。

使用 %TYPE 運算子

您可以使用%TYPE標記法聲明固定到列的子類型。例如:

SUBTYPE emp_type IS emp.empno%TYPE

此命令建立名為emp_type的子類型,其基本類型匹配emp表中empno列的類型。基於列的子類型將共用列大小約束;NOT NULL和CHECK約束不會繼承。

子類型轉換

不受約束的子類型是其所基於的類型的別名。子類型(不受約束)的任何類型變數都可以與基本類型的變數互換而無需轉換,反之亦然。

受約束子類型的變數可以與基本類型的變數互換而無需轉換,但基本類型的變數只能在符合子類型約束時與受約束的子類型互換。如果基於相同的子類型,則受約束子類型的變數可以隱式地轉換為另一個子類型,並且約束值在其所轉換的子類型值範圍內。