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

Oracleデータベースでユーザー定義データ型を使用してネストされたテーブルを作成する方法

    やあみんな!今日は、ユーザー定義のデータ型を使用してネストされたテーブル型コレクションを作成する方法を学習します。プリミティブデータ型を使用したネストされたテーブルの作成プロセスを学習した最後のチュートリアルで素晴らしい時間を過ごしたことを願っています。そこからの概念を使用するので、そのチュートリアルをご覧になることを強くお勧めします。

    プリミティブデータ型と同様に、ネストされたテーブルはユーザー定義データ型を使用して作成することもできます。デモンストレーションでは、ユーザーOracleObjectを使用します。 OOPの概念を学んだことがある場合は、オブジェクトを紹介する必要はありません。 Oracleでは、他のプログラミング言語と同様に、オブジェクト型は一種のデータ型であり、Char、Varchar2、Numberなどの他のデータ型と同じように機能しますが、柔軟性が高くなります。

    Oracleオブジェクトを作成するには、古くて信頼できる「CreateType」ステートメントを使用します。

    CREATE OR REPLACE TYPE object_type AS OBJECT (
      obj_id  NUMBER,
      obj_name  VARCHAR2(10)
    );
    /
    

    上記のステートメントは、正常に実行されると、「objecttype」という名前のoracleオブジェクトと2つの属性obj_idおよびobj_nameを作成します。このデータ型を使用して、ネストされたテーブルを作成できます。

    CREATE OR REPLACE TYPE My_NT IS TABLE OF object_type;
    /
    

    前回のチュートリアルを確認すると、プリミティブデータ型である要素型を除いて、上記のステートメントは非常によく知られていると思います。ここでは、Oracleオブジェクトであるユーザー定義データ型を使用します。

    上記のステートメントは、ここで確認できる最後のチュートリアルで詳細に説明されています。

    Oracle Objectを使用してネストされたテーブルを作成するとはどういう意味ですか?

    Oracleオブジェクトを使用してネストされたテーブルを作成する場合は常に、オブジェクトの属性がそのテーブルの列になります。たとえば、この例では、ユーザー定義データ型を使用してネストされたテーブル「My_NT」を作成しました。これは、2つの属性obj_idとobj_nameを持つOracleオブジェクト「Object_Type」です。オブジェクトのこれら2つの属性は、テーブルの列として機能します。次の写真は、これをより明確に理解するのに役立ちます。

    ユーザー定義のデータ型を使用してネストされたテーブルを作成したので、次はそれを機能させます。

    CREATE TABLE Base_Table(
      tab_id  NUMBER,
      tab_ele My_NT
    )NESTED TABLE tab_ele STORE AS stor_tab_1;
    /
    

    上記の「Base_Table」という名前のテーブルは、「tab_id」と「tab_ele」の2つの列を持つ単純なテーブルです。最初の列は数値データ型で、2番目の列はネストされたテーブルタイプです。これは、2番目の列にテーブルが含まれており、そのテーブルがネストされたテーブル「My_Nt」であることを意味します

    この「Base_Table」は単純なテーブルですが、その列の1つにネストされたテーブルが含まれているため、次のような質問が発生します。

    テーブルにデータを挿入する方法は?テーブルのデータを更新するにはどうすればよいですか?または、テーブルからデータを取得する方法は?これらすべての質問に対する答えを一度に1つずつ見つけてみましょう。

    ネストされたテーブルにデータを挿入する方法

    はい、ネストされたテーブルタイプの列を持つテーブルにデータを挿入するのは難しい場合があることに同意しますが、どういうわけかそれを行う方法を見つける必要があります。データのないテーブルは私たちには役に立たないので。右?それをどのように行うことができるか見てみましょう。

     INSERT INTO base_table (tab_id, tab_ele) VALUES
     (801,  -- value for 1st colum 
       My_NT (object_type (1,'Superman') -- values for 2nd column )
     );
    

    このINSERTステートメントでわかるように、テーブルの2番目の列にデータを挿入する行番号3を除いて、すべてが通常のInsertDMLと同じです。ネストされたテーブルタイプの列にデータを挿入するには、最初にネストされたテーブルの名前(この場合は「My_NT」)を書き込む必要があります。次に、Oracleオブジェクトの名前(ここでは「Object_Type」)を書き込む必要があります。その後に、テーブルに挿入する値が続きます。テーブル名とオブジェクト名の括弧を一致させることを忘れないでください。一致しないと、エラーが発生します。

    ネストされたテーブルの値を更新するにはどうすればよいですか?

    UPDATE base_table SET tab_ele = My_NT(object_type(1,'SpiderMan')) WHERE tab_id = 801; 

    上記のDMLステートメントは、実行が成功するとそれに応じて値を更新します。

    ネストされたテーブルからデータを取得するにはどうすればよいですか?

    テーブルでSelectステートメントを実行するだけで、データを取得できます。

    Select tab_id, tab_ele FROM base_table;

    次の図は、このテーブルから返された結果を示しています。

    ご覧のとおり、このSELECTステートメントは、プライマリデータ型の列のデータを表示しますが、ネストされたテーブルの名前と、ネストされたテーブルタイプとして定義した列のOracleオブジェクトのみを表示します。このようなTABLE式を使用すると、この問題を簡単に克服できます。

    SELECT * FROM TABLE(
      SELECT tab_ele FROM Base_Table WHERE tab_id = 801
    )
    

    上記のクエリを正常に実行すると、テーブル「Base_Table」の2番目の列のデータがリレーショナル形式で表示されます。

    このチュートリアルは以上です。楽しんで、新しいことを学んだことを願っています。必ずサブスクライブしてサインアップしてください。良い一日を!


    1. 結果を取得するときにあいまいな列名を解決するにはどうすればよいですか?

    2. Oracle11gでのXMLtable

    3. PostgreSQLへのリモート接続を設定する方法

    4. インラインvarchar(max)列を使用する必要がありますか、それとも別のテーブルに保存する必要がありますか?