sql >> データベース >  >> RDS >> Oracle

Oracleでネストされたテーブルをデータベースオブジェクトとして作成する方法

    作成するネストされたテーブルを再利用する場合は、データベースオブジェクトとして再利用するのが最適です。それらをデータベースに永続的に保存し、いつでも使用できます。

    PL/SQLブロック内にネストされた表タイプのPL/SQLコレクションを作成する以外に、それらをデータベース・オブジェクトとして作成し、永続的に格納することもできます。また、いつでも再利用できます。データベースオブジェクトとして作成されるネストされたテーブルは、プリミティブデータ型またはユーザー定義データ型のいずれかに基づくことができます。このチュートリアルでは、前者に集中し、後者は次のチュートリアルに残します。

    プリミティブデータ型に基づいてネストされたテーブル型コレクションを作成する方法

    プリミティブデータ型とは、言語によって事前定義され、予約されたキーワードによって名前が付けられたデータ型を意味します。 PL / SQLデータ型の詳細については、このOracleドキュメントを参照してください。

    次のテーブルには、制約やインデックスなどが設計されておらず、ネストされたテーブルをデータベースオブジェクトとして作成する方法を示すためだけに作成されています。

    ステップ1:サーバー出力をオンに設定

    SET SERVEROUTPUT ON;

    ステップ2:ネストされたテーブルタイプのコレクションを作成する

    CREATE OR REPLACE TYPE my_nested_table IS TABLE OF VARCHAR2 (10);
    /
    
    のテーブルです。

    正常に実行された場合の上記のステートメントは、プリミティブデータ型VARCHAR2に基づく「my_nested_table」という名前のネストされたテーブルを作成します。

    ステップ3:ネストされたテーブルの使用方法

    上で作成したコレクションタイプを使用して、テーブルの列のタイプを指定できます。

    CREATE TABLE my_subject(
    	  sub_id    	NUMBER,
    	  sub_name  	VARCHAR2 (20),
    	  sub_schedule_day    my_nested_table
    ) NESTED TABLE sub_schedule_day STORE AS nested_tab_space;
    /
    

    上記のテーブルは、3列が複数の値を保持できるネストされたテーブルタイプであることを除いて、通常のテーブルです。テーブルの列をネストされたテーブルタイプとして定義するには、コンパイラに列の名前とストレージテーブルを通知する必要があります。これは、行番号5で行ったように、NESTEDABLE句とSTOREAS句を使用して行うことができます。NESTEDTABLE句を使用して列の名前を指定し、STOREAS句を使用してネストされたテーブルのストレージテーブルを指定します。

    上記のテーブル作成プロセスを段階的に説明したビデオチュートリアルを参照できます。

    テーブルに行を挿入します

    INSERT INTO my_subject (sub_id, sub_name, sub_schedule_day)
    VALUES (101, 'Maths', my_nested_table('mon', 'Fri'));
    

    通常のテーブルに挿入するのと同じように、ネストされたテーブルに行を挿入します。ただし、ネストされたテーブルタイプの列にデータを挿入するには、最初にネストされたテーブルの名前(この場合は'my_nested_table')を記述し(手順2を参照)、次にネストされたテーブルのデータ型に従ってデータを書き込む必要があります。括弧で囲みます。

    テーブルからデータを取得する

    単純なSELECTDMLステートメントを使用して、テーブルからデータを取得できます。

    SELECT * FROM my_subject;

    この単純なDMLステートメントは、上記で作成したテーブルに格納されているすべてのデータを表示します。特定の行のデータを表示するには、SELECTDMLでWHERE句を使用できます

    SELECT * FROM my_subject WHERE sub_id = 101;

    必要に応じて、サブクエリを使用して、ネストされたテーブルタイプとして定義した列のデータを確認できます。

    SELECT * FROM TABLE (
      SELECT sub_schedule_day FROM my_subject WHERE sub_id = 101
    );
    

    上記のクエリは、sub_schedule_day列からのみsubject-id101を持つsubjectのデータを表示します。このクエリでは、TABLE式を使用してインスタンスを開き、データをリレーショナル形式で表示しました。

    テーブルのデータを更新する

    ネストされたテーブルとして定義する列のすべての値を更新するか、同じものの単一のインスタンスを更新することができます。

    ネストされたテーブルタイプ列のすべての値を更新します。

    UPDATE my_subject SET sub_schedule_day = my_nested_table('Tue', 'Sat') 
    WHERE sub_id = 101;
    /
    

    上記のクエリは、sub_schedule_dayのすべての値を「Mon」、「Fri」から「Tue」、「Sat」に更新します。ここで、「Sat」を「Thu」に置き換えて、この列の1つのインスタンスのみを更新するとします。どうしますか?

    ネストされたテーブルの単一インスタンスを更新する

    ネストされたテーブルタイプ列の単一のインスタンスを更新するために、もう一度TABLE式を使用できます。

    UPDATE TABLE
      (SELECT sub_schedule_day FROM my_subject 
      WHERE sub_id = 101) A
    SET A.COLUMN_VALUE   = 'Thur' 
    WHERE A.COLUMN_VALUE = 'Sat';
    

    上記のクエリは、テーブルの値を「Sat」から「Thur」に更新します。

    あなたが読書を楽しんで、何か新しいことを学んだことを願っています。そのような興味深いチュートリアルがたくさんあるので、必ず私たちのチャンネルに登録してください。ありがとう&素晴らしい一日を!


    1. 列数が行1の値数と一致しません

    2. Postgresクエリの最適化(インデックススキャンの強制)

    3. 2 Oracleの日付から日、月、年を取得する関数

    4. TSQLPIVOTの複数の列