|
■No87734 (悩み多きランナー さん) に返信
> UTL_FILE.PUT_LINE(FL_PACK,CONVERT('カンマ区切りのレコード変数','AL32UTF8','AL32UTF8'));
PUT_LINE で出力できましたっけ?
-- 案1 --
DECLARE
--ファイルパッケージ
FL_PACK UTL_FILE.FILE_TYPE;
-- ZERO WIDTH NO-BREAK SPACE
ZWNBSP CONSTANT NVARCHAR2(1) := UTL_RAW.CAST_TO_NVARCHAR2(HEXTORAW('FEFF'));
BEGIN
-- Unicode ファイルを出力するのだから、FOPEN ではなく FOPEN_NCHAR を使う
-- なお、コンテンツは NVARCHAR2 で良いけれど、ファイルパスは VARCHAR2 なので注意
FL_PACK := UTL_FILE.FOPEN_NCHAR('C:\test', 'test.csv', 'w', 32767);
-- BOM の代用として ZWNBSP を送出
-- 当然、PUT ではなく PUT_NCHAR を使う
UTL_FILE.PUT_NCHAR( FL_PACK, ZWNBSP );
-- ここからがデータ本体
-- PUT_LINE ではなく PUT_LINE_NCHAR を使う
UTL_FILE.PUT_LINE_NCHAR( FL_PACK, N'1,最初の行,first' );
UTL_FILE.PUT_LINE_NCHAR( FL_PACK, N'2,後続の行,second' );
UTL_FILE.PUT_LINE_NCHAR( FL_PACK, N'3,最後の行,last' );
UTL_FILE.FCLOSE( FL_PACK );
END;
-- 案2 --
DECLARE
FL_PACK UTL_FILE.FILE_TYPE;
BOM_UTF8 CONSTANT RAW(3) := HEXTORAW('EFBBBF');
BOM_UTF16__BE CONSTANT RAW(2) := HEXTORAW('FEFF');
BOM_UTF16__LE CONSTANT RAW(2) := HEXTORAW('FFFE');
BOM_UTF32__BE CONSTANT RAW(4) := HEXTORAW('0000FEFF');
BOM_UTF32__LE CONSTANT RAW(4) := HEXTORAW('FFFE0000');
-- 今回は CR+LF 改行にしてみる
LINE NVARCHAR2(2) := NCHR(13) || NCHR(10);
DST_CHAR_SET VARCHAR2(64) := 'AL32UTF8';
SRC_CHAR_SET VARCHAR2(64) := 'AL16UTF16';
BEGIN
-- テキスト出力(w)モードではなく、バイナリ出力モード(wb)にする
FL_PACK := UTL_FILE.FOPEN('C:\test', 'test.csv', 'wb', 32767);
UTL_FILE.PUT_RAW( FL_PACK, BOM_UTF8 );
-- バイナリ出力なので、改行も自分で補う必要がある
UTL_FILE.PUT_RAW( FL_PACK, UTL_I18N.STRING_TO_RAW( N'1,最初の行,first' || LINE, DST_CHAR_SET) );
UTL_FILE.PUT_RAW( FL_PACK, UTL_I18N.STRING_TO_RAW( N'2,後続の行,second' || LINE, DST_CHAR_SET) );
UTL_FILE.PUT_RAW( FL_PACK, UTL_I18N.STRING_TO_RAW( N'3,最後の行,last' || LINE, DST_CHAR_SET) );
UTL_FILE.FCLOSE( FL_PACK );
END;
|