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

オブジェクトタイプのテーブルへの選択を実行することは可能ですか?

    はい、そうです。オブジェクトのコンストラクターで列をラップし、BULK COLLECTを使用する必要があります SELECTのオプション ステートメント:

    CREATE OR REPLACE TYPE t_some_type AS OBJECT(f varchar2(10))
    /
    
    CREATE OR REPLACE TYPE t_some_table IS TABLE OF t_some_type
    /
    
    DECLARE
       v_some_table t_some_table;
    BEGIN
       SELECT t_some_type (dummy)
       BULK   COLLECT INTO v_some_table
       FROM   DUAL;
    END;
    

    余談ですが、(例のように)本体だけでなく、オブジェクト仕様も作成する必要があります。

    SELECTの列 オブジェクトのコンストラクターにあるのと同じ順序である必要があります。コンストラクターを明示的に定義していない場合は、仕様で宣言されている順序で各列にコンストラクターが明示的に存在します。

    この機能を使用することの唯一の欠点は、行数が多いとメモリ使用量が多くなることです。これを使用して多数の行を処理する場合は、LIMITでループを使用する必要があります 条項。

    仕様にある列リストに加えて、明示的なコンストラクターを指定することができます。コンストラクターは、定義した任意の入力を持つことができるため、明示的なコンストラクターを使用する場合は、その引数リストに従う必要があります。次に例を示します。

    CREATE OR REPLACE TYPE t_some_type AS OBJECT
    (
       f1 VARCHAR2 (10),
       CONSTRUCTOR FUNCTION t_some_type (p_length NUMBER, p_value VARCHAR2)
          RETURN SELF AS RESULT
    );
    /
    
    CREATE OR REPLACE TYPE BODY t_some_type AS
       CONSTRUCTOR FUNCTION t_some_type (p_length NUMBER, p_value VARCHAR2)
          RETURN SELF AS RESULT IS
       BEGIN
          self.f1 := LPAD (p_value, p_length, p_value);
          RETURN;
       END t_some_type;
    END;
    /
    
    CREATE OR REPLACE TYPE t_some_table IS TABLE OF t_some_type
    /
    
    DECLARE
       v_some_table t_some_table;
    BEGIN
       --Explicit Constructor
       SELECT t_some_type (10, dummy)
       BULK   COLLECT INTO v_some_table
       FROM   DUAL;
       DBMS_OUTPUT.put_line (v_some_table (1).f1);
    
       --Implicit Constructor
       SELECT t_some_type (dummy)
       BULK   COLLECT INTO v_some_table
       FROM   DUAL;
       DBMS_OUTPUT.put_line (v_some_table (1).f1);
    END;
    


    1. PostgreSQLのjson_agg()関数が空の配列を返さないのはなぜですか?

    2. 計算列を使用して同じビューで別の列を計算する方法

    3. AzureSQLデータベースのパフォーマンス調整オプション

    4. クエリSQLServer2008でDATEADD分を選択します