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) |