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

PolarDB:入れ子になったテーブル

最終更新日:May 29, 2024

ネストされたテーブルは、正の整数を値に関連付けるコレクションの一種です。

ネストされたテーブルの特徴は次のとおりです。

  • ネストされたテーブル型を定義する必要があります。その後、そのネストされたテーブル型のネストされたテーブル変数を宣言できます。 データ操作は、ネストされたテーブル変数または略して「テーブル」を使用して行われます。
  • ネストされたテーブル変数が宣言されると、ネストされたテーブルは最初は存在しません (nullコレクションです) 。 nullテーブルは、コンストラクターで初期化する必要があります。 代入文を使用してテーブルを初期化することもできます。代入文の右側は同じ型の初期化されたテーブルです。 注: ネストされたテーブルの初期化はOracleでは必須ですが、SPLではオプションです。
  • キーは正の整数です。
  • コンストラクタは、テーブル内の要素の数を確立します。 EXTENDメソッドは、テーブルに追加の要素を追加します。 注: テーブル内の要素数を確立するためのコンストラクタの使用と、テーブルに追加の要素を追加するためのEXTENDメソッドの使用は、Oracleでは必要ですが、SPLではオプションです。
  • テーブルはスパースにすることができます-キーへの値の割り当てにはギャップがあります:
  • 初期化または拡張サイズを超えてテーブル要素を参照しようとすると、SUBSCRIPT_BEYOND_COUNT例外が発生します。

TYPE IS TABLEステートメントは、SPLプログラムの宣言セクション内でネストされたテーブル型を定義するために使用されます。

TYPE tbltypeは {datatype | rectype | objtype };

tbltypeは、ネストされたテーブルタイプに割り当てられた識別子です。 datatypeは、VARCHAR2やNUMBERなどのスカラーデータ型です。 rectypeは、事前に定義されたレコードタイプです。 objtype は、以前に定義されたオブジェクト型です。

説明 CREATE TYPEステートメントを使用して、データベース内のすべてのSPLプログラムで使用できるネストされたテーブル型を定義できます。

テーブルを使用するには、そのネストされたテーブル型の変数を宣言する必要があります。 テーブル変数を宣言する構文は次のとおりです。

  • tbltypeテーブル

    tableは、ネストされたテーブルに割り当てられた識別子です。 tbltypeは、以前に定義されたネストされたテーブルタイプの識別子です。

    ネストされたテーブルは、ネストされたテーブル型のコンストラクターを使用して初期化されます。

  • tbltype ([ { expr1 | NULL } [, { expr2 | NULL } ] [...] ])

    tbltypeは、ネストされたテーブル型のコンストラクタの識別子です。 tbltypeは、ネストされたテーブル型と同じ名前です。 expr1、expr2、... は、テーブルの要素型と型互換性のある式です。 NULLが指定された場合、対応する要素はnullに設定されます。 パラメーターリストが空の場合、空のネストされたテーブルが返されます。つまり、テーブルに要素が存在しません。 テーブルがオブジェクト型から定義されている場合、exprnはそのオブジェクト型のオブジェクトを返す必要があります。 オブジェクトは、関数またはオブジェクト型のコンストラクターの戻り値にすることも、同じ型の別のネストされたテーブルの要素にすることもできます。

EXISTS以外のコレクションメソッドが初期化されていないネストされたテーブルに適用されると、COLLECTION_IS_NULL例外がスローされます。

次のコードは、ネストされたテーブルのコンストラクターの例です。

DECLARE
    TYPE nested_typはチャートのテーブルです (1);
    v_nested nested_typ := nested_typ('A' 、'B'); 

テーブルの要素は、次の構文を使用して参照されます。

テーブル (n)[.element ]

tableは、以前に宣言されたテーブルの識別子です。 nは正の整数である。 テーブルのテーブル型がレコード型またはオブジェクト型から定義されている場合、[.element] は、ネストされたテーブル型が定義されているオブジェクト型内のレコード型または属性内の個々のフィールドを参照する必要があります。 あるいは、[.element] を省略することによって、レコードまたはオブジェクト全体を参照することができる。

次のコードは、4つの要素が存在することがわかっているネストされたテーブルの例です。

DECLARE
    TYPE dname_tbl_typはVARCHAR2(14) のテーブルです。
    dname_tbl dname_tbl_typ;
    CURSOR dept_cur IS SELECT dname FROM dept ORDER BY dname;
    i INTEGER := 0;
開始
    dname_tbl := dname_tbl_typ(NULL, NULL, NULL, NULL);
    dept_curループでr_deptのため
        i := i + 1;
        dname_tbl(i) := r_dept.dname;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('DNAME');
    DBMS_OUTPUT.PUT_LINE('---------');
    FOR j IN 1 .. iループ
        DBMS_OUTPUT.PUT_LINE(dname_tbl(j));
    エンドループ;
エンド; 

上記の例では、次の出力が生成されます。

DNAME
----------
会計
操作
研究
販売 

次の例では、empテーブルから最初の10人の従業員名を読み取り、ネストされたテーブルに格納してから、テーブルの結果を表示します。 SPLコードは、返品される従業員の数が事前に知られていないことを前提として記述されています。

DECLARE
    タイプemp_rec_typは記録されています (
        empno       NUMBER(4),
        ename VARCHAR2 (10)
    );
    タイプemp_tbl_typはemp_rec_typのテーブルです。
    emp_tbl emp_tbl_typ;
    CURSOR emp_curはSELECT empno、ename FROM WHERE ROWNUM <= 10です。
    i INTEGER := 0;
開始
    emp_tbl := emp_tbl_typ();
    DBMS_OUTPUT.PUT_LINE('EMPNO    ENAME');
    DBMS_OUTPUT.PUT_LINE('-----    -------');
    FOR r_emp IN emp_cur LOOP
        i := i + 1;
        emp_tbl.EXTEND;
        emp_tbl(i) := r_emp;
    END LOOP;
    FOR j IN 1 .. 10ループ
        DBMS_OUTPUT.PUT_LINE(emp_tbl(j).empno | | '|
            emp_tbl(j).ename);
    エンドループ;
エンド; 

匿名ブロックの実行可能トピックの最初のステートメントとしてコンストラクターemp_tbl_typ() を使用して空のテーブルを作成することに注意してください。 次に、EXTENDコレクションメソッドを使用して、結果セットから返された各従業員のテーブルに要素を追加します。

出力は次の通りです。

EMPNO ENAME
----- -------
7369スミス
7499アレン
7521ワード
7566ジョーンズ
7654マーティン
7698 BLAKE
7782 CLARK
7788スコット
7839キング
7844ターナー 

次の例は、オブジェクト型のネストされたテーブルを使用する方法を示しています。 まず、部門名と場所の属性を持つオブジェクトタイプが作成されます。

CREATE TYPE dept_obj_typ AS OBJECT (
    dname VARCHAR2(14),
    loc VARCHAR2 (13)
); 

次の匿名ブロックは、要素がdept_obj_typオブジェクト型で構成されるネストされたテーブル型を定義します。 ネストされたテーブル変数が宣言され、初期化され、deptテーブルから入力されます。 最後に、ネストされたテーブルの要素が表示されます。

DECLARE
    TYPE dept_tbl_typはdept_obj_typのテーブルです。
    dept_tbl dept_tbl_typ;
    CURSOR dept_cur IS SELECT dname, loc FROM dept ORDER BY dname;
    i INTEGER := 0;
開始
    dept_tbl := dept_tbl_typ (
        dept_obj_typ(NULL、NULL) 、
        dept_obj_typ(NULL、NULL) 、
        dept_obj_typ(NULL、NULL) 、
        dept_obj_typ(NULL,NULL)
    );
    dept_curループでr_deptのため
        i := i + 1;
        dname := r_dept.dname;
        dept_tbl(i).loc := r_dept.loc;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('DNAME LOC');
    DBMS_OUTPUT.PUT_LINE('--------- ----------');
    FOR j IN 1 .. iループ
        DBMS_OUTPUT.PUT_LINE(RPAD(dept_tbl(j).dname,14) | | '| |
            dept_tbl(j).loc);
    エンドループ;
エンド; 
説明 ネストされたテーブルのコンストラクターdept_tbl_typを構成するパラメーターは、オブジェクト型のコンストラクターdept_obj_typへの呼び出しです。

匿名ブロックから次の出力が生成されます。

DNAME LOC
--------- ------------
ニューヨークの会計
操作ボストン
研究ダラス
販売シカゴ