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

CTEのOracleテーブル関数

    Objectsを処理している間 selectを作成するときは、特に注意が必要です。 。コードにエラーがあり、問題が発生していました。また、以下で行われる直接割り当てが実際に許可されているかどうかもよくわかりません:

    rec := PART_TEST(record);

    ただし、ここでは2つの解決策を提案します。最初にPipeline そしてそれなしで他。以下を参照してください:

    -テーブルとオブジェクトの準備

    CREATE TABLE part_table (
        part_no   NUMBER,
        col1      NUMBER
    );
    
    INSERT INTO PART_TABLE VALUES(1,11);
    INSERT INTO PART_TABLE VALUES(1,33);
    INSERT INTO PART_TABLE VALUES(2,22);
    
    SELECT * FROM PART_TABLE;
    
    CREATE OR REPLACE TYPE part_test IS OBJECT (
        part_no   NUMBER,
        col1      NUMBER
    );
    
    CREATE OR REPLACE TYPE part_test_t IS  TABLE OF part_test;
    /
    

    -パイプラインを使用した機能

    CREATE OR replace FUNCTION part_test_f(search_part IN number)
    RETURN part_test_t PIPELINED 
    AS 
    
     rec part_test; --<--Variable of type Object since we want to piperow.
    
     CURSOR cur(part_num number) IS 
          WITH A AS 
          (       --Make sure you cast your select statement of object type    
                  SELECT part_test(PART_NO,col1) FROM PART_TABLE WHERE PART_NO LIKE part_num
           )
           SELECT * FROM A;        
    BEGIN        
       OPEN cur(search_part) ;
        LOOP
          Fetch cur into rec;    --<-- Note here am not using `Bulk Collect` even though its being a collection since we are `piping` the rows.    
          exit when cur%NOTFOUND;
           pipe row(rec);         
        END LOOP;
    RETURN ;
    END;
    /
    

    結果:

    SQL> SELECT * FROM TABLE (PART_TEST_F(1));
    
         PART_NO       COL1
        ---------- ----------
          1            11
          1            33
    

    -パイプラインなし

    CREATE OR REPLACE FUNCTION part_test_f (search_part IN NUMBER) 
    RETURN part_test_t 
     AS
        rec   part_test_t;
        CURSOR cur ( part_num NUMBER) IS 
        WITH a AS 
        ( SELECT part_test( part_no,col1 )
           FROM part_table
           WHERE part_no LIKE part_num       
        ) 
        SELECT *  FROM a;
    BEGIN
        OPEN cur(search_part);
        LOOP
            FETCH cur BULK COLLECT INTO rec;
            EXIT WHEN cur%notfound;      
        END LOOP;
        RETURN rec;
    END;
    /
    

    結果:

    SQL> Select * from table (part_test_f(1));
    
       PART_NO       COL1
    ---------- ----------
             1         11
             1         33
    

    自分に合ったものを選択してください。ただし、Pipelineを使用する利点は誰もが知っています。 したがって、それが最も適した機能です。




    1. Mavenの特定のクラスパス

    2. 合計に基づいてMySQLのパーセンタイルを計算します

    3. 挿入トリガーがアクティブなときに4バイトのUTF-8文字/絵文字をMySQLデータベースに挿入する際の問題

    4. MySQL暗号化/機密データの保存、