그것 PLSQL로 할 수 있어(그 1 PLSQL로 Zip 파일을 작성한다)

3442 단어 오라클plsql
Oracle에서 Select한 결과를 CSV로 출력하고 싶다는 경우는 상당히 많다고 생각합니다만, Oracle 단품으로 출력으로부터 압축까지 하고 싶은 적은 없습니까?

나는 하고 싶지 않았지만, 손님으로부터 "하고 싶다"라고 말했다.

PLSQL에서 Zip 파일을 만듭니다.



오라클에는 "UTL_COMPRESS"이라는 패키지가 있으며 압축, 압축 해제가 가능하지만 불행히도 Zip은 지원하지 않습니다.

"AS_ZIP"라는 패키지를 도입하여 쉽게 대응할 수있었습니다.
gunzip과 Zip의 차이는 헤더의 차이뿐이므로, 바이너리로 고르고리 고치면 Zip이 된다고 합니다. (훌륭함)



AS_ZIP을 사용한 ZIP 작성 샘플



Zip 작성 프로 시저



기본적으로는 필요한 파일을 add1file 하고 finish_zip 으로 작성, save_zip 로 써내는 것만.

내보내기 대상은 OracleDirectory를 지정합니다.

CREATE_ZIP.sql
CREATE OR REPLACE PROCEDURE CREATE_ZIP
IS
  -- OracleDirectory
  DIRECTORY_NAME  CONSTANT VARCHAR2(100) := 'DIR';
  -- 直接記述時、書き出し文字コード
  TXT_CODE        CONSTANT VARCHAR2(100) := 'JA16SJIS';

  vFileName1 VARCHAR2(256);
  vFileName2 VARCHAR2(256);
  vZipName   VARCHAR2(256);
  bZipped    BLOB;
BEGIN
  -- csvファイルを作成する
  vFileName1 := 'test.csv';
  create_csv(vFileName1);

  -- 作成したファイルを追加
  as_zip.add1file( bZipped, vFileName1, as_zip.file2blob (DIRECTORY_NAME,vFileName1));

  -- ディレクトリの指定も可能
  vFileName2 := 'dir/test.txt';

  -- テキスト内容を直接記述して追加
  as_zip.add1file( bZipped, vFileName2, utl_i18n.string_to_raw( 'dirの中にいる' , TXT_CODE ) );

  -- ファイルの追加を終了
  as_zip.finish_zip( bZipped );

  vZipName := 'test.zip';

  -- 書き出し
  as_zip.save_zip( bZipped, DIRECTORY_NAME, vZipName);
END CREATE_ZIP;
/

Csv 작성 프로 시저



아마 잘 하는 SJIS의 CSV의 작성 프로시저도 공개.
utl_file은 put일 수 있지만 쓸모없는 문자로 죽을 수 있으므로 put_raw를 사용합니다.

CREATE_CSV.sql
CREATE OR REPLACE PROCEDURE CREATE_CSV(
  vFileName IN VARCHAR2
)
IS
  -- OracleDirectory
  DIRECTORY_NAME  CONSTANT VARCHAR2(100) := 'DIR';

  -- CSV作成時に利用する定数
  CSV_CODE        CONSTANT VARCHAR2(100) := 'JA16SJIS';
  CR_CODE         CONSTANT VARCHAR2(10)  := CHR(13);
  LF_CODE         CONSTANT VARCHAR2(10)  := CHR(10);
  NEW_LINE_CODE   CONSTANT VARCHAR2(100) := CR_CODE||LF_CODE;

  -- ファイル作成時に利用するファイルハンドル
  vHandle  UTL_FILE.FILE_TYPE;
BEGIN
  vHandle := utl_file.fopen(DIRECTORY_NAME, vFileName, 'WB', 32767);

  -- Testテーブルの中身を明細行として出力
  for rec in (
    select col1 || ',' || col2 as var -- csvの明細行を作成
    from test
    order by col1
  ) loop
    -- 文字コードを指定して改行コードと共に出力
    utl_file.put_raw(vHandle, utl_i18n.string_to_raw( rec.var || NEW_LINE_CODE , CSV_CODE ), TRUE );
  end loop;

  utl_file.fclose(vHandle);
END CREATE_CSV;
/

결과









제대로되어 있습니다.

좋은 웹페이지 즐겨찾기