Skip to Main Content

Japanese

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

UTF_FILE.PUT_LINEで特定の文字で異常終了

pompomOct 6 2013 — edited Oct 8 2013

初めて投稿させていただきます。
あるシステムにて下記の事象が発生し、原因の調査を行っているのですが解決の糸口がつかめず困っております。
解決のきっかけを求めて有識者のご意見を聞きたいと思い、投稿いたしました。
よろしくお願いいたします。

■事象
UTF_FILE.PUT_LINEを使用してCSVファイルを出力する際に
「ORA-29285:ファイル書込みエラーが発生しました。」
のエラーが特定の文字列で発生することがある。

■質問内容
1.過去に同様の事象やその原因についてご存じないでしょうか。
2.ご存じの場合、どのように対処すればよいでしょうか。
3.ご存じでない場合、調査方法について良い方法はないでしょうか。

■構成
OS:Red Hat Enterprise Linux Server release 6.2(Santiago)
 NLS_LANG:JAPANESE_JAPAN.AL32UTF8
Oracle:Oracle Database Standard Edition One 11.2.0.3.0
 NLS_CHARACTERSET:AL32UTF8

■詳細
 ・エラーが発生する出力行の最後が「~作業台"←」(~:文字列の省略、←:改行コード(LF))
 ・出力行の最後が「~作業台"←」のレコードでも正常に出力されるレコードもある。
 ・エラーが発生したデータを使用して出力すると必ず同じレコードでエラーが発生する。(再現性有)
 ・エラーが発生したレコードのみを同一のプログラムでヘッダ行と合わせて2行だけ出力すると正常に出力される。
 ・エラーデータからエラーレコードを除いて出力すると、先ほどまでエラーとなっていなかった最後が「~作業台"←」のレコードでエラーが発生する。
 ・エラーデータのCSV出力項目の順序を入れ替えると正常に出力される。
  (出力行の最後が指定の文字以外となるように変更した場合は正常に出力される。)
 ・アラートログ、トレースファイルには何も出力されていない。

 ・DBサーバの文字コードはUTF-8であるが、出力したCSVをユーザー様がWindowsクライアントで使用するため、CONVERT関数でSJISへの変換を行っている。
  シェルスクリプトで変換を行うと変換できない文字があった場合にエラーとするか無視して変換(その文字が出力されない)となるが、
  ユーザー様より「?」に変換して出力してほしいとの依頼があったため、プロシージャ内で変換を行っている。

 ・どのようなデータでも発生するのではなく大半のデータは正常に出力される。
  エラー発生時もエラー直前のレコードまでは正常に出力されている。
  そのため、ファイルパスの不整合やパーミッションの問題ではないという認識。

■ソース(一部抜粋)
1行ごとに下記の処理で出力しています。
    FUNCTION OutputLine (
        pv_buffer    IN VARCHAR2
    )
    RETURN NUMBER IS
        v_buffer    VARCHAR2(32767) DEFAULT NULL; --出力文字列
        n_rtn        NUMBER;                      -- リターンコード
    BEGIN

        -- 出力文字列の文字コードをSJISに変換
        v_buffer := CONVERT(pv_buffer, 'JA16SJISTILDE');

        prc_put_line(
                    n_rtn ,         -- エラーコード
                    mfp_out_file ,  -- ファイルポインタ
                    v_buffer        -- 出力文字列
                    ) ;

        IF n_rtn <> constant.N_0 THEN
            RAISE APP_ERROR;        -- 独自定義の例外
        END IF;

        RETURN 0;

    EXCEPTION
        WHEN OTHERS THEN
            RETURN 9;
    END OutputLine;

    PROCEDURE prc_put_line(
        pn_Rtn       OUT   NUMBER ,                -- 戻り値
        pf_Fp        IN    UTL_fILE.FILE_TYPE ,    -- ファイルポインタ
        pv_Data      IN    VARCHAR2                -- 1行に記述されるデータ
    ) IS
    BEGIN
        -- フィールドデータの書込み処理
        UTL_FILE.PUT_LINE( pf_Fp , pv_Data );
        -- 正常終了
        pn_Rtn := 0;
    EXCEPTION
        WHEN OTHERS THEN
            -- 異常終了
            pn_Rtn := 9;
    END prc_put_line ;

■出力文字列例(1行が上記ソースのpv_bufferに当たる)
"品目コード","品目名称","メーカーコード","商品ランク","公開フラグ","分類コードA","分類コードB","分類コードC","分類コードD","2013年度分類コードA","2013年度分類名称A","2013年度分類コードB","2013年度分類名称B","2013年度分類コードC","2013年度分類名称C","2013年度分類コードD","2013年度分類名称D"
"AKDTH23957                    4526      ","トーサン ステンレス作業台キャスター付","0000845623","","1 ","F ","20","34","1934 ","F","物流保管用品","20","作業台","34","ステンレス作業台","1934","ステンレス作業台"

This post has been answered by pompom on Oct 8 2013
Jump to Answer
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Nov 5 2013
Added on Oct 6 2013
6 comments
24,445 views