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

多くのselectステートメントの結果を1つのカスタムテーブルとして返す方法

    あなたの場合、コレクションに動的にデータを入力しようとしていて、単一のコレクションに結果を求めています。あなたの場合、単一のループでそれを行うことは不可能です。また、@ OldProgrammerで言及されているように、パフォーマンスの観点からは、piperowの方が優れたソリューションになります。以下のデモを参照してください:

    -表と値:

    CREATE TABLE SOURCE_TAB(TAB_NAME VARCHAR2(100),   DESCRIPTION  VARCHAR2(100));
    /
    
    SELECT * FROM SOURCE_TAB;
    /
    
    INSERT INTO SOURCE_TAB VALUES('table1','some_desc1');
    INSERT INTO SOURCE_TAB VALUES('table2','some_desc2');
    /
    
    CREATE TABLE TABLE1(COL1 NUMBER, COL2 NUMBER);
    /
    
    INSERT INTO TABLE1 VALUES(1,2);
    INSERT INTO TABLE1 VALUES(3,4);
    INSERT INTO TABLE1 VALUES(5,6);
    /
    
    Select * from TABLE1;
    /
    
    CREATE TABLE TABLE2(COL1 NUMBER, COL2 NUMBER);
    /
    
    INSERT INTO TABLE2 VALUES(7,8);
    INSERT INTO TABLE2 VALUES(9,10);
    INSERT INTO TABLE2 VALUES(11,12);
    /
    
    Select * from TABLE2;
    /
    

    -作成されたオブジェクト

    --UDT 
    CREATE OR REPLACE TYPE NEWLY_CREATED_TABLE_TYPE IS OBJECT (
         VALUE1                        NUMBER,
         VALUE2                        NUMBER
    );
    /
    
    --Type of UDT
    CREATE OR  TYPE NEWLY_CRTD_TYP AS TABLE OF NEWLY_CREATED_TABLE_TYPE;
    /
    

    -機能:

    --Function
    CREATE OR REPLACE FUNCTION MY_FUNCTION
         RETURN NEWLY_CRTD_TYP PIPELINED
    AS
         CURSOR CUR_TAB
         IS
              SELECT *
                FROM SOURCE_TAB;
    
         RET_TAB_TYPE                  NEWLY_CRTD_TYP;
    BEGIN
         FOR I IN CUR_TAB
         LOOP
              --Here i made sure that all the tables have col1 & col2 columns since you are using dynamic sql. 
              EXECUTE IMMEDIATE    'select  NEWLY_CREATED_TABLE_TYPE(COL1, COL2)  from '|| I.TAB_NAME
              BULK COLLECT INTO RET_TAB_TYPE;
    
              EXIT WHEN CUR_TAB%NOTFOUND;
    
              FOR REC IN 1 .. RET_TAB_TYPE.COUNT
              LOOP
                   PIPE ROW (RET_TAB_TYPE (REC) );
              END LOOP;
         END LOOP;
    
         RETURN;
    END;
    /
    

    出力:

        SQL>  Select *  from table(MY_FUNCTION);
    
        VALUE1     VALUE2
    ---------- ----------
             1          2
             3          4
             5          6
             7          8
             9         10
            11         12
    
    6 rows selected.
    


    1. このmysqlイベントを実行できないのはなぜですか?

    2. JavaリストからSQL配列を作成するにはどうすればよいですか?

    3. 致命的なエラー:キャッチされない例外'mysqli_sql_exception'とメッセージ'クエリ/プリペアドステートメントでインデックスが使用されていません'

    4. SQLServerでの1対0または1の関係の実装