メニュー
プロフィール
最近の記事
カテゴリ分類
記事一覧
FOR ENGINEERS
注目! テレビや雑誌でも紹介されているペン型ICレコーダー

RedHat Enterprisze Linux 5サーバーにOracle 11g を搭載している。
このOracle DBのPL/SQLプロシージャーを使って
テキストファイルを作成する処理で、問題があったので記述しておく。

以下のような、テキストファイルを作成するためのプロシージャを作成する。
PROCEDURE DATAFILE_MAKE
(
P_FILENAME IN CHAR
) IS
V_DN VARCHAR2(128);
V_FP UTL_FILE.FILE_TYPE;
BEGIN

V_DD := '/tmp';
V_FP := UTL_FILE.FOPEN(V_DN, P_FILENAME, 'W');
/*
DATA_TBLの「DATA_ID」「DATA_01」「DATA_02」のフィールド値を
右詰・固定長のテキストファイルとして出力する
*/
FOR
REC IN
(
SELECT
DATA_ID
,NVL(DATA_01, ' ')
,NVL(DATA_02, ' ')
FROM
DATA_TBL
ORDER BY
DATA_ID
)
LOOP
UTL_FILE.PUT(V_FP, SUBSTR(' ' || REC.DATA_ID, -6));
UTL_FILE.PUT(V_FP, SUBSTR(' ' || REC.DATA_01, -8));
UTL_FILE.PUT(V_FP, SUBSTR(' ' || REC.DATA_02, -8));
UTL_FILE.NEW_LINE(V_FP, 1);
END LOOP;
UTL_FILE.FCLOSE(V_FP);

END DATAFILE_MAKE;
上記↑のようなプロシージャを作成し、
exec DATAFILE_MAKE('data_01.txt');
のように実行して、
/tmp/data_01.txt
という固定長のテキスト・ファイルを作成する。
※ちなみにORACLEのサーバー・パラメータに以下を追加しておく。
UTL_FILE_DIR='*'

この時に以下のような問題に遭遇した。

1. ファイルの書込み権限が無いので、削除できない
2. 改行コードが"LF"となってしまう。

■ファイルの書込み権限が無いので、削除できない
●内容
 作成されるファイル「/tmp/data_01.txt」のオーナーが「oracle」ユーザーで、ファイルのパーミッションが「rw-r--r--」(644)となっているため、ファイル作成後に、他のユーザーで削除できない事が判明した。

●解決策
 「~oracle/.bash_profile」を編集、
 「umask 022」⇒ 「umask 000」 に変更する。
 変更後、Oracle DBサーバーを再起動する。

●概要
 オラクルDBのサーバー・プロセスを実行しているユーザーは「oracle」である。
 この「oracle」ユーザーのログインスクリプト(ホームディレクトリ配下の「.bash_profile」)を見てみると、UMASKが0200となっている。
 そのため、oracleユーザーで作成するファイルは、デフォルトのパーミッションが0644となってしまい、他のユーザーには書き込み権限が与えられない。
 従って、デフォルトのパーミッションが「0666」となるよう
umask 000
としておく。


■改行コードが"LF"となってしまう。
●内容
 テキストファイルの改行コードが"LF"となってしまっているため、
Windowsでこのファイルを操作する時に、不整合が生じた。

●解決策
 外部コマンドを使って"LF"を"CRLF"に変更する事にした。
・nkfを使う(文字コードをSHIFT-JISとする)
# nkf -cws $org > $file

・perlを使う方法でもOK
# perl -pe 's/\n/\r\n/' $org > $file

※注意:変換前のファイルの改行コードが既に"CRLF"だった場合
 nkfの場合、変換後のファイルは"CRLF"のままなので問題ないのだが、Perlの場合には、変換後のファイルは「"CRCRLF"」となってしまう。
 もう少し複雑なスクリプトにすれば、Perlでも変換できますが・・・。

●概要
 根本的な解決策が分からなかったので、上記のような方法を使った。
 本来は「ファイルを作成する時点で"CRLF"となる」という方法が本筋とは思うのだが・・・。


| IT-ソフトウェア関連::Oracle | 08:43 PM | comments (x) | trackback (x) |
PAGE TOP ↑