2017-01-19 56 views
0

私のpl/sqlプロシージャでは1700万行を収集しようとしていますが、エラーで失敗しますORA-04030: 16328バイト(KOH-kghuコール、pmuccst:ADT /レコード)割り当てる数百万行のBULK COLLECTに関する問題 - プロセスメモリ不足

TYPE rc_test IS RECORD(
    ROWID VARCHAR2(200), 
    contact_id VARCHAR2(200), 
    last_name VARCHAR2(200), 
    first_name VARCHAR2(200), 
    phone VARCHAR2(200), 
    email VARCHAR2(200), 
    birth_day date, 
    address_id VARCHAR2(200), 
    seq NUMBER, 
    NEWID NUMBER); 

TYPE rctype 
    IS TABLE OF RC_TEST; 

rcrecords RCTYPE; 

BEGIN 

SELECT ROWID, 
     contact_id, 
     last_name, 
     first_name, 
     phone, 
     email, 
     birth_day, 
     address_id, 
     seq, 
     NEWID 
bulk collect INTO rcrecords 
FROM HR.TMP_TBL_SEQ a 
order by last_name, first_name, seq; 

FOR i IN 1..rcrecords.count LOOP 

から< < >> エンドループと、

数百または数千の行のサンプルデータで正常に動作しますが、数百万行は使用できません。

私はこのエラーのトラブルシューティングを読んだことがありますが、そのほとんどはチューニングを行うDBAによって行われています。問題を解決する可能性のあるRAMを増やすようアドバイスしますが、コード自体のロジックを変更します。

上記のタイプのコードでロジックを改善して、メモリ不足エラーを取り除く良い方法がありますか?

私のコードで使用されているテーブルレコードの代わりに、誰でも私に代替コードを提供できますか?

多くのありがとうございます。

答えて

0

BULK COLLECTLIMIT句(http://www.oracle.com/technetwork/issue-archive/2008/08-mar/o28plsql-095155.html)を使用できます。あなたのケースでは、のようになります。BULKの「無制限」使用のこの種を避け

CURSOR cur1 IS 
    SELECT ROWID, contact_id, last_name, first_name, 
    phone, email, birth_day, address_id, seq, 
    NEWID FROM HR.TMP_TBL_SEQ a order by last_name, first_name, seq; 
TYPE T_TEST IS TABLE OF cur1 %ROWTYPE INDEX BY PLS_INTEGER;; 
test_data T_TEST; 
BEGIN 
OPEN cur1; 
LOOP 
    FETCH cur1 
     BULK COLLECT INTO test_data LIMIT 10000; 

    FOR indx IN 1 .. test_data.COUNT 
    LOOP 
     NULL; 
     --- process data 
    END LOOP; 

    EXIT WHEN test_data.COUNT < 10000; 
END LOOP; 
CLOSE cur1; 
0

は、forループカーソルでBULK COLLECTの交換を参照してください、このOracleハイテク問題を参照してください。

begin 
    for rcrecords in 
    (
     SELECT ROWID, 
       contact_id, 
       last_name, 
       first_name, 
       phone, 
       email, 
       birth_day, 
       address_id, 
       seq, 
       NEWID 
     bulk collect INTO rcrecords 
     FROM HR.TMP_TBL_SEQ a 
     order by last_name, first_name, seq 
    ) loop 
     --Process data. 
     null; 
    end loop; 
end; 
/

Oracleが自動的にバルクの世話をするには、限度を収集し、データ型を宣言します。

関連する問題