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

Oracle参照カーソルをテーブル変数にフェッチする方法は?

    上記のコードの変数の名前はあなたを誤解させました。変数outtable tableにあります タイプ。レコードデータをレコードテーブルにフェッチすることはできませんが、レコード自体にフェッチすることはできます。

    DECLARE 
        REFCUR SYS_REFCURSOR;   
        TYPE RECORDTYPE IS RECORD (COL1 NUMBER, COL2  VARCHAR(100));
        outtable RECORDTYPE; 
    BEGIN 
        SP_OUT_RefCur_PARAM(REFCUR);
        LOOP
            FETCH REFCUR INTO outtable;
            EXIT WHEN REFCUR%NOTFOUND;
            dbms_output.put_line(outtable.col1);
        END LOOP;
        CLOSE REFCUR;
    END;
    

    更新: アプリケーションのパフォーマンスを向上させるためにすべてのデータをフェッチする場合は、BULKCOLLECTステートメントを使用する必要があります。

    DECLARE 
        REFCUR SYS_REFCURSOR;   
        TYPE RECORDTYPE IS
            RECORD (COL1 NUMBER, COL2  VARCHAR(100));
        TYPE TABLETYPE IS
            TABLE OF REFTABLETYPE
            INDEX BY PLS_INTEGER;
        outtable TABLETYPE; 
    BEGIN 
        SP_OUT_RefCur_PARAM(REFCUR);
        LOOP
            FETCH REFCUR INTO BULK COLLECT outtable;
            EXIT WHEN outtable.COUNT = 0;
    
            FOR indx IN 1 .. outtable.COUNT 
            LOOP
                dbms_output.put_line(outtable(indx).col1);;
            END LOOP;
        END LOOP;
        CLOSE REFCUR;
    END;
    

    注:BULKステートメントを使用した場合のメモリ消費量は、使用しない場合よりもはるかに多くなります。

    ただし、行をフェッチして処理するだけの場合は、一度に1行ずつ、BULKに必要はありません。 ステートメントの場合は、カーソルをFOR LOOPで使用します。 。 (トムに質問



    1. com.microsoft.sqlserver.jdbc.SQLServerException:ホストlocalhost、ポート1433へのTCP/IP接続に失敗しました

    2. Doctrine-プリペアドステートメントだけでなく、実際のSQLを出力する方法は?

    3. 5種類のデータベース修復

    4. 本当にSETXACT_ABORTONを使用する必要がありますか?