1

この投稿の最後にある pl/sql コード ブロックを参照してください。

zip から特定のファイルを抽出する pl/sql コードを書いています。http://technology.amis.nl/wp-content/uploads/2010/06/as_zip7.txtにある「as_zip」パッケージを使用して、zip () で見つかったファイル名を取得し、AS_ZIP.GET_FILE_LIST特定のものを抽出しています。 BLOB( )に変換され、AS_ZIP.GET_FILEを使用してファイルに書き込まれますUTL_FILE

最初の質問
モニタリングで見た限りでは、UNDO TABLESPACEこのプロセス中に に書き込まれるようには見えませんが、これが本当であることを他の人に確認したかったのです...特定のファイルの内容をBLOBファイルに書き出される場合、影響UNDO TABLESPACEはありますか? ビジネスが課金対象のデータベースで使用するメガバイトごとに、可能な限りテーブルスペースを減らす方法を常に探す必要があります...

2 番目の質問
ブロブをファイルに書き込むという点で、私が行った方法よりも効率的な方法はありますか? 最初のファイル (たまたま 3.03GB で最大) は、ファイル システムへの書き込みがすばやく行われますが、後続の各ファイルの書き込みはますます遅くなるように見えます。リソースを解放するか、別の方法で割り当てる必要がありますか、それとも....

SET SERVEROUTPUT ON
declare
  zip_files as_zip.file_list;
  l_file UTL_FILE.FILE_TYPE;
  L_BUFFER RAW (32767);
  L_AMOUNT BINARY_INTEGER := 32767;
  l_pos INTEGER;
  L_BLOB BLOB;
  l_blob_len INTEGER;
BEGIN

  DBMS_OUTPUT.ENABLE(1000000);

  ZIP_FILES  := AS_ZIP.GET_FILE_LIST( 'MY_DIR', 'MY_FILE.zip' );

  for i in zip_files.first() .. zip_files.last
  LOOP
    FOR EXT_TABLE_REC IN (SELECT LOCATION FROM USER_EXTERNAL_LOCATIONS) LOOP

      -- Check if there's a match between what's in the zip file and what the external table name is
      IF (INSTR(TRIM(LOWER(ZIP_FILES(I))),TRIM(LOWER(EXT_TABLE_REC.LOCATION || '__'))) > 0) THEN

        DBMS_OUTPUT.PUT_LINE('Match found on ' || ZIP_FILES(I) || ', ' || EXT_TABLE_REC.LOCATION || ' - processing...');  

        L_BLOB := AS_ZIP.GET_FILE('MY_DIR', 'MY_FILE.zip', zip_files(i));

        -- Open the destination file. Note the third parameter "wb"
        l_file := UTL_FILE.FOPEN ('MY_DIR', EXT_TABLE_REC.LOCATION, 'wb');

        l_blob_len := DBMS_LOB.getlength (l_blob);

        -- Read chunks of the BLOB and write them to the file until complete.
        l_pos := 1;

        WHILE l_pos < l_blob_len
        LOOP
          DBMS_LOB.READ (l_blob, l_amount, l_pos, l_buffer);
          UTL_FILE.put_raw(l_file, l_buffer, FALSE);
          l_pos := l_pos + l_amount;
        END LOOP;

        -- Close the file.
        UTL_FILE.FCLOSE (L_FILE);

      end if;

    end loop;

  end loop;

END;
/

誰かが疑問に思っている場合に備えて、ログイン時にデータベース情報として返されるのは次のとおりです。

Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, Oracle Label Security,
OLAP, Data Mining, Oracle Database Vault and Real Application Testing options

編集 1オラクルのサイトで見つけた情報に基づい
て、ブロックを削除しました。EXCEPTION WHEN OTHERS今、プロセスがハングしているように見えるので、問題がどこで発生しているのかわかりません...

4

2 に答える 2

0

LOB セグメントの UNDO は、ハッシュ テーブルの通常の UNDO とは異なる方法で管理されます。UNDO は、LOB 列自体の一部として管理および格納されます。pctversion パラメータを使用すると、元に戻すためにどれだけのスペースを確保するかを指定できます。値はパーセンテージ値として指定されます。

于 2012-06-05T08:35:20.193 に答える
0

DBMS_LOB.READ 呼び出しでは、l_amount は IN OUT パラメータであり、外側のループを通過するたびに小さくなります。1 まで小さくなる可能性があり、その場合、一度に 1 バイトを処理しています。l_pos := 1; を設定した直後 l_mount=32767; も設定します。

于 2015-01-20T20:06:25.413 に答える