Oracle と互換性のある PolarDB データベースは、ユーザー定義の PL/SQL サブタイプとサブタイプエイリアスをサポートしています。 サブタイプは、そのタイプの列に格納できる値を制限するオプションの制約セットを持つデータ型です。 サブタイプが基づくタイプに適用されるルールは引き続き適用されますが、他の制約を使用して、型に格納される値の精度、またはスケールに制限を設けることができます。

PL 関数、プロシージャ、匿名ブロック、またはパッケージの宣言でサブタイプを定義します。 構文は次のとおりです。

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

ここでは、constraint は次のとおりです。

{precision [, scale]} | length

ここでは、

  • subtype_name: サブタイプの名前を指定します。
  • type_name: サブタイプが基づく元の型の名前を指定します。

    type_name は次のいずれかです。

    • Oracle と互換性のある PolarDB データベースでサポートされるいずれかの型の名前。
    • 複合型の名前。
    • %TYPE 演算子でアンカーされた列。
    • 別のサブタイプの名前。

精度またはスケールをサポートする型の制限を定義するには、constraint 句を含めます。

  • precision: サブタイプの値で許可される総桁数を指定します。
  • scale: サブタイプの値で許可される小数点以下の桁数を指定します。
  • length: CHARACTER、VARCHAR、または TEXT 基本型の値で許可される全長を指定します。

NOT NULL 句を含めて、指定したサブタイプの列に NULL 値を格納できないように指定します。

列に基づくサブタイプは列サイズの制約を継承しますが、サブタイプは NOT NULL または CHECK 制約を継承しないことにご注意ください。

制約のないサブタイプ

制約のないサブタイプを作成するには、SUBTYPE 文を使用して、新しいサブタイプ名と、サブタイプが基づく型の名前を指定します。 たとえば、次の文は、CHAR 型のすべての属性を持つ address という名前のサブタイプを作成します。

SUBTYPE address IS CHAR;

別のサブタイプのサブタイプ (制約付きまたは制約なし) を作成することもできます。

SUBTYPE cust_address IS address NOT NULL;

この文は、address サブタイプのすべての属性を共有する cust_address という名前のサブタイプを作成します。 NOT NULL 句を含めて、cust_address の値が NULL にならないように指定します。

制約付きサブタイプ

文字型に基づいてサブタイプを作成するときに長さの値を含めて、サブタイプの最大長を定義します。 例:

SUBTYPE acct_name IS VARCHAR (15);

この例では、VARCHAR データ型に基づく acct_name という名前のサブタイプを作成しますが、長さは 15 文字に制限されています。

精度の値 (サブタイプの値の最大桁数を指定するため) を含め、数値基本型を制約するときにオプションでスケール (小数点の右側の桁数を指定するため) を含めます。 例:

SUBTYPE acct_balance IS NUMBER (5, 2);

この例では、NUMBER 型のすべての属性を共有する acct_balance という名前のサブタイプを作成しますが、小数点の左側に 3 桁、小数点の右側に 2 桁を超えることはできません。

(関数またはプロシージャヘッダー内の) 引数宣言は、仮引数です。 関数またはプロシージャに渡される値は、実引数です。 関数またはプロシージャを呼び出すとき、呼び出し元は 0 個以上の実引数を提供します。 各実引数は、関数またはプロシージャの本体内の値を保持する仮引数に割り当てられます。

仮引数が制約付きサブタイプとして宣言されている場合:

  • 関数の呼び出し中に実引数を仮引数に割り当てるときに、Oracle と互換性のある PolarDB データベースはサブタイプ制約を実行しません。
  • プロシージャの呼び出し中に実引数を仮引数に割り当てるときに、Oracle と互換性のある PolarDB データベースはサブタイプ制約を実行します。

%TYPE 演算子の使用

%TYPE 表記を使用して、列にアンカーされたサブタイプを宣言します。 例:

SUBTYPE emp_type IS emp.empno%TYPE

この文は、基本型が emp テーブルの empno 列の型と一致する emp_type という名前のサブタイプを作成します。 列に基づくサブタイプは、列サイズの制約を共有しますが、NOT NULL および CHECK 制約は継承しません。

サブタイプ変換

制約のないサブタイプは、それらが基づいている型のエイリアスです。 制約のないサブタイプの型変数は、変換せずに基本型の変数と交換可能であり、その逆も同様です。

制約付きサブタイプの変数は、変換せずに基本型の変数と交換できますが、基本型の変数がサブタイプの制約に準拠している場合にのみ、基本型の変数を制約付きサブタイプと交換できます。 制約付きサブタイプの変数は、同じサブタイプに基づいており、制約値が変換先のサブタイプの値内にある場合、暗黙的に別のサブタイプに変換することができます。