実現したい事は、 UTL_FILEでUTF-8のcsvファイルを読み込んで文字化けなくINSERTする事ですが
INSERTしたデータに文字化けが発生していて困っております。
文字化けしているのは、ベトナム語の文字です。
文字化けせずINSERTする方法があったらご教授ください。
文字化けしている文字の例:Nguyễn Hiếu
文字化け後:Nguy?n Hi?u
エラーメッセージ
◆PL/SQLコード PROCEDURE insert_table IS ln_file_line NUMBER; --参照中の行数 lv_csv_handle UTL_FILE.FILE_TYPE; --CSVファイルハンドル lv_csv_buf VARCHAR2(32767); --CSVファイルバッファ ld_sysdate DATE; --登録用の日時 wk_buffer VARCHAR2(32767); BEGIN --変数の初期化 ln_file_line := 0; ld_sysdate := SYSDATE; --ファイルオープン lv_csv_handle := UTL_FILE.FOPEN( ディレクトリパス , file_name , 'R',32767); cnt_insert := 0; --全行ループ <<import_loop>> LOOP BEGIN --配列初期化 tbl_type_textlist := tbl_type_textlist_null; --レコード読み込み UTL_FILE.GET_LINE(lv_csv_handle,lv_csv_buf); <b>wk_buffer := CONVERT( lv_csv_buf, 'AL32UTF8','UTF8');</B> lv_csv_buf := wk_buffer; --行数カウントアップ ln_file_line := ln_file_line + 1; --1行目スキップ(ヘッダ行なので) IF ln_file_line = 1 THEN CONTINUE; END IF; --読み込み1レコードをカンマで分割し配列に格納 --(tbl_type_textlistに格納される) split_text(lv_csv_buf); --登録 INSERT INTO NEW_DATA ( 省略 ) VALUES ( NVL2(tbl_type_textlist(1),TO_NUMBER(tbl_type_textlist(1)),NULL) 以下省略 ) cnt_insert := cnt_insert+1; EXCEPTION --最終行まで読み込んだ場合 WHEN NO_DATA_FOUND THEN EXIT; --その他のエラー WHEN OTHERS THEN --ファイルが開いていたら閉じる IF UTL_FILE.IS_OPEN(lv_csv_handle) THEN UTL_FILE.FCLOSE(lv_csv_handle); END IF; --例外表示は、上位モジュールで行う。 RAISE; END; --全行ループ終了 END LOOP import_loop; --CSVファイルを閉じる UTL_FILE.FCLOSE(lv_csv_handle); ◆テーブルCREATE一部 EMP_NAMEにベトナム文字が入ります。 CREATE TABLE TEST_TABLE ( NO NUMBER(20,9), COM VARCHAR2(6), DUMMY_DATE VARCHAR2(8), EMP_CODE VARCHAR2(20), EMP_NAME VARCHAR2(200) ) PCTFREE 10 MAXTRANS 255 TABLESPACE AA STORAGE(INITIAL 4M NEXT 4M MINEXTENTS 1 MAXEXTENTS 2147483645 BUFFER_POOL DEFAULT) NOCACHE LOGGING / ◆外部表 CREATE TABLE NEW_DATA ( ID_NO NUMBER(20,9), COM VARCHAR2(6), DUMMY_DATE VARCHAR2(8), EMPL_CODE VARCHAR2(20), EMPL_NAME VARCHAR2(200) ) ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY DUMM_DIR ACCESS PARAMETERS ( RECORDS DELIMITED BY NEWLINE READSIZE 1048576 DATE_CACHE 1000 CHARACTERSET AL32UTF8 FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"' ( ID_NO, COM, DUMMY_DATE, EMPL_CODE, EMPL_NAME ) ) LOCATION ( 'test.csv' ) )
試したこと
GET_LINEでCONVERTするとエラーになる為、
GET_LINE後にワークを作成してそこにCONVERT後の値を格納しましたが文字化けか解消しませんでした。
●GET_LINEでCONVERT時のエラー
UTL_FILE.GET_LINE(lv_csv_handle,CONVERT(lv_csv_buf,'AL32UTF8','UTF8'));
PLS-00363:式COMVERT(SV_CSV_BUF,AL32UTF8 ,UTF8)は割り当てターゲットとして使用できません。
●GET_LINE後にワークに格納
wk_buffer := CONVERT( lv_csv_buf, 'AL32UTF8','UTF8');
●オブジェクトブラウザ―は日本語版で文字化けする為、
DBサーバーでコマンドプロンプトからsqlplusでselectした結果を取得しましたが文字化けしています。
以下コマンドプロンプト
chcp 65001
sqlplus user /as sysdba
spool c:\oraclelog.txt
set trimspool on
SELECT * table FROM XXXX;
spool off
結果ファイルの該当箇所はNguy?n Hi?uとなっています。
補足情報(FW/ツールのバージョンなど)
DB:Oracle 18c SE2 Ver18.3.0.0.0
Server:Windows Server 2016
DBキャラクタセット:AL32UTF8
ナショナルキャラクタセット:AL16UTF16
Object Browser for Oracle Ver 11.1.0.0