すべてのプロダクト
Search
ドキュメントセンター

PolarDB:サブタイプ

最終更新日:May 30, 2024

このトピックでは、サブタイプの構文と例について説明します。

構文

PL/SQLを使用すると、ユーザーは基本タイプに特定の制約を課すことでサブタイプをカスタマイズできます。

サブタイプを定義するには、次の構文を使用します。

SUBTYPE subtype_name IS base_type
    [precision [, scale ] | RANGE low_value .. high_value ] [ NOT NULL ]; 

DECLARE
  SUBTYPE subtype_charはVARCHAR(10) です。
  sub_var subtype_char;
  base_var VARCHAR(10);
開始
  NULL;
エンド; 

sub_varbase_varはどちらもVARCHAR型を表しますが、長さは限られています。 基本型には、CHARやRECORDなどのスカラーまたはユーザー定義のPL/SQLデータ型指定子を使用できます。

  • 例 1:

    DECLARE
      TYPE r_type IS RECORD(id INT, name VARCHAR(10));
      SUBTYPE subtype_record IS r_type;
      rec subtype_record;
    開始
      rec.id := 1;
      rec.name := 'a';
      RAISE NOTICE 'rec = % '、rec;
    エンド; 

    サンプル結果:

    通知: rec = (1,a)
    行う 
  • 例 2:

    DECLARE
      SUBTYPE subtype_charはVARCHARです。
      SUBTYPE sub_subtype_char IS subtype_char;
      sub_var sub_subtype_char;
    開始
      sub_var := 'a';
      RAISE NOTICE 'sub_var = % ', sub_var;
    エンド; 

    サンプル結果:

    通知: sub_var = a
    行う 

制約のないサブタイプ

制約のないサブタイプは、基本型と同じ値のセットを持つため、基本型の別の名前にすぎません。 同じ基本タイプの制約のないサブタイプは、互いに、および基本タイプと交換可能である。 データ型の変換は行われません。 制約のないサブタイプを定義するには、次の構文を使用します。

SUBTYPE subtype_name IS base_type;

制約付きサブタイプ

制約付きサブタイプには、その基本型の値のサブセットのみが含まれます。 基本型でサイズ、精度、スケール、または値の範囲を指定できる場合は、それらのサブタイプを指定できます。 制約付きサブタイプを定義するには、次の構文を使用します。

SUBTYPE subtype_name IS base_type
    {precision [, scale ] | RANGE low_value .. high_value } [ NOT NULL ] 

サブタイプを使用する変数にNOT NULL制約を適用できます。 基本型がPLS_INTEGERのサブタイプにRANGE制約を適用することもできます。

制約付きサブタイプはその基本型に暗黙的に変換できますが、値がサブタイプの制約に違反しない場合にのみ、基本型を制約付きサブタイプに暗黙的に変換できます。

ある制約付きサブタイプの変数を別の制約付きサブタイプの変数に割り当てるには、暗黙的な変換の要件とターゲットサブタイプの制約の両方を満たす必要があります。

以下の例では、ターゲットサブタイプの制約は満たされていません。

  • 精密拘束

    DECLARE
      SUBTYPE subtype_numberは番号 (8,2) です。
      var1 subtype_number;
      var2 subtype_number;
    開始
      var1 := 100000.00; -- 割り当てが成功しました。
      RAISE NOTICE 'var1 = % '、var1;
      var2 := 1000000.00; -- 割り当てが失敗しました。
    エンド; 

    サンプル結果:

    通知: var1 = 100000
    エラー: 数値フィールドのオーバーフロー
    詳細: 精度8、スケール2のフィールドは、10 ^ 6未満の絶対値に丸める必要があります。
    コンテキスト: PL/SQLの割り当て "var2 := 1000000.00" 
  • 範囲の制約

    DECLARE
      SUBTYPE subtype_range IS PLS_INTEGER RANGE 0 .. 9;
      var subtype_range := 4; -- 割り当ては成功です。
    BEGIN
      RAISE NOTICE 'var = % '、var;
      var := 10; -- 割り当てに失敗しました。
    エンド; 

    サンプル結果:

    通知: var = 4
    エラー: 変数 "var" の割り当ては、0と9の間で宣言されているため、範囲外です。コンテキスト: 割り当て時のPL/SQL関数inline_code_block行6 
  • NOT NULL制約

    DECLARE
      SUBTYPE subtype_rangeはINT NOT NULLです。
      var subtype_range := 1;
    開始
      RAISE NOTICE 'var = % '、var;
      var := NULL; -- 割り当てに失敗しました。
    エンド; 

    サンプル結果:

    通知: var = 1
    ERROR: NOT nullを宣言した変数 "var" にNULL値を割り当てることはできません
    コンテキスト: PL/SQL関数inline_code_block 5行目割り当て時 
  • 暗黙的な型変換

    DECLARE
      SUBTYPE subtype_int IS INT;
      SUBTYPE subtype_char IS CHAR(3);
      var1 subtype_int := 100;
      var2 subtype_char;
    開始
      var2 := var1; -- 割り当てが成功しました。
      警告 'var2 = % '、var2;
      var1 := 1000;
      var2 := var1; -- 割り当てが失敗しました。
    エンド; 

    サンプル結果:

    通知: var2 = 100
    ERROR: 型文字には値が長すぎます (3 char)
    コンテキスト: 割り当て時のPL/SQL関数inline_code_block行10 

ローカル関数の入力パラメータと戻り値の型

サブタイプは、他のローカル型と同様に、ローカル関数の入力パラメーターおよび戻り値の型として使用できます。

DECLARE
  SUBTYPE sub_typeはVARCHAR(20) です。
  PROCEDURE outer_proc IS
    outer_var sub_type; -- ローカル型sub_typeを使用する
    FUNCTION inner_func (名前sub_type) RETURN sub_type IS
    BEGIN
      RETURN name | | 'inner'; -- 戻り値はsub_type型です
    END;
  BEGIN
    outer_var := inner_func('outer-'); -- ローカル関数inner_funcを呼び出す
    RAISE NOTICE '%' 、outer_var;
  エンド;
開始
  outer_proc; -- 最初にローカルプロシージャouter_procを呼び出します
エンド; 

サンプル結果:

通知: outer-inner
行う 
説明

OUT型の入力パラメーターは、入力変数をNULLに初期化します。 したがって、入力パラメーターがNOT NULL制約のサブタイプである場合、エラーが発生します。

DECLARE
  SUBTYPE sub_type IS PLS_INTEGER NOT NULL;
  sub_type := 1;
  PROCEDURE proc_test(id OUT sub_type)
  BEGIN
    NULL;
  エンド;
開始
  proc_test(a); -- エラーが発生します。
エンド; 

サンプル結果:

ERROR: NOT nullを宣言した変数 "a" にNULL値を割り当てることはできません
コンテキスト: PL/SQL関数inline_code_block行3 (CALL)