質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

1回答

13749閲覧

Oracle PL/SQL の UTL_FILEでUTF-8のcsvファイル読み込みで文字化けします

coco0928

総合スコア0

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

0クリップ

投稿2020/09/15 06:34

編集2020/09/15 08:21

実現したい事は、 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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2020/09/15 06:58

TABLE は予約語ですから、テーブル名や列名などに使ってはなりません。誤動作の原因になるかも? 使っているテーブルのCREATE TABLEを質問に追記してください。 CREATE TABLEやコードは https://teratail.com/help/question-tips#questionTips3-7 の [コード] に修正してください。
coco0928

2020/09/15 08:03

回答ありがとうございます。コード設定しました。 INSERT部分のテーブル名はダミーの名称を設定したつもりがtableのみになっていました。
Orlofsky

2020/09/15 19:26

コードは実行できるレベルで提示してください。 PROCEDURE の前には CREATE OR REPLACE が必要。 PROCEDURE の最後に END insert_table ; / の2行が勝手に省略されている。 split_text の内容も必要。 INSERT文は省略しない。 ; もあちこち省略しない。 CREATE OR REPLACE PROCEDURE IS BEGIN END insert_table ; / は1カラム目から記述。字下げは厳格に4桁ずつ。だから、全体にコードが雑に見える。 Markdown はファイル毎に。 外部表を使ってのINSERT ... SELECT も質問に追記。
guest

回答1

0

UTL_FILE.GET_LINEって使い勝手があまり良くないので、外部表 が使われることが多いです。外部表を試しても文字化けしますか?

DB:Oracle 18c SE2 Ver18.3.0.0.0

パッチがまったく適応されていないのはまずいです。サポート契約していればパッチを入手できます。バグがいろいろ改善されています。文字化けを改善するパッチがあるかはサポート契約者のみが知り得る情報ですが。

投稿2020/09/15 07:12

Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco0928

2020/09/15 08:20

外部表で試してみましたが、文字化けしていました。 パッチに関しては、担当に確認してみます。
Orlofsky

2020/09/15 19:25

CSVがUTF-8なら、CONVERTは不要では?
coco0928

2020/09/16 00:49

文字化けしているので色々と試していました。 当初はCONVERTなしでした。
Orlofsky

2020/09/16 08:21

CSVのエンコードはUTF-8でしょうか? [質問への追記・修正の依頼]に対応してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問