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

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

新規登録して質問してみよう
ただいま回答率
86.12%
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が使われる傾向があります。

文字コード

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

受付中

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

coco0928
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が使われる傾向があります。

文字コード

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

1回答

0リアクション

0クリップ

7716閲覧

投稿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

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

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 も質問に追記。

まだ回答がついていません

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

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が使われる傾向があります。

文字コード

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