- PR -

PL/SQL文にて

1
投稿者投稿内容
ShigeX
会議室デビュー日: 2005/03/01
投稿数: 3
投稿日時: 2005-03-01 17:56
PL/SQL文にて、コーディングをしています。ある週次処理のデータ
をCSV形式で保存して置くものです。意図した通りにプログラムは
動作するのですが、ファイルに何のデータも入ってこない場合の分
岐処理を加えて、データが入ってこなかった場合にはファイルは作
成しないというロジックを検討しています。

そこでUTL_FILE.FREMOVE のプロシージャを使って1KBのファイル
は削除するという処理を考えてみましたが、うまく行かないようです。

どなたかうまいやり方をご存知無いでしょうか?
最終的にはOSのシェルで削除するしか無いかなとも思っています。


--略--

--ファイル名設定
file_name := UPPER(rec_kaisya_1.kaisya_cd) || '_KATAMEI_ERROR_' || to_char(sysdate, 'YYMMDD') || '.csv';

--ファイルオープン(新規書き込みモード)
File_Handle := UTL_FILE.FOPEN(file_dir, file_name, 'w');
--日付の書き込み
UTL_FILE.PUTF(File_Handle, 'Created: %s\n', SYSDATE);
--ファイルへの書き込み(改行のみ)
UTL_FILE.NEW_LINE(FILE_HANDLE);
--見出しの書き込み
v_line_header := '会社コード, 会社名, 販製品名, 数量';
UTL_FILE.PUT_LINE(File_Handle, v_line_header);

--会社毎のデータ取得
FOR rec_kaisya IN cur_kaisya(v_nenki,rec_kaisya_1.kaisya_cd ) LOOP
--一行づつ書き込み
UTL_FILE.PUTF(File_Handle,' ''%s, ''%s, ''%s, %s\n',
rec_kaisya.kaisya_cd
,rec_kaisya.kaisya_jname
  ,rec_kaisya.hanseihin_mei
,rec_kaisya.su);

END LOOP;
UTL_FILE.FCLOSE(File_Handle);

END LOOP;

--略--

/*


*ファイルの削除

ファイルの削除のプロシージャはUTL_FILE.FREMOVE を利用します。
このプロシージャは実行するユーザーに十分な権限があるという前提で
ファイルの削除をすることが可能。
このプロシージャはバイナリデータに対しても使用可能。

<プロシージャ定義>
UTL_FILE.FREMOVE
(削除対象のあるディレクトリ名IN VARCHAR2,
移動対象のファイルIN VARCHAR2)

<使用例>
C:\DATAFILE\TEST.TXT を削除する
SQL> host dir /b
TEST.TXT
SQL> exec utl_file.fremove('DIR_C','TEST.TXT');
PL/SQL プロシージャが正常に完了しました。
SQL> host dir /b
SQL>


*/
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2005-03-02 13:16
仰る意味がよく解りませんでした。
何を尋ねているのでしょうか?

私は4通り受取れました。

・対象データ0件時に出力ファイルを作成しないロジックが解らない。
・ファイルが思った様に削除されない。
・デバッグの仕方が解らない
・何が解らないか解らない

_________________
人生変わっちゃうかもよ?OFF会参加者募集中今考えるな、参加してから考えろ。
ShigeX
会議室デビュー日: 2005/03/01
投稿数: 3
投稿日時: 2005-03-02 14:03
はにまるさん、質問文がわかりにくくてすみませんでした。ご指摘の最初の部分の"対象データ0件時に出力ファイルを作成しないロジックが解らない。" というところがそもそも私が知りたかったところです。でも、もし、ファイルを作成したあとでも、空ファイルを削除できるようにすれば、結果が同じようになるのではないかと思い、UTL_FILE.FREMOVE のプロシージャを使えるかと思いましたが、これも思ったように行かず、皆さんのお知恵をお借りしたかった次第です。
kanai
ベテラン
会議室デビュー日: 2004/09/13
投稿数: 98
投稿日時: 2005-03-02 14:46
使用しているDBサーバーはOracleだと思いますが、どのバージョンでしょうか?
環境を書いてください。

とりあえず、私の環境はOracle 9i R9.0.1(Windows 2000 Server)には
UTL_FILE.FREMOVEというプロシージャは見つかりませんでした。

SELECT PROCEDURE_NAME FROM ALL_PROCEDURES WHERE OBJECT_NAME = 'UTL_FILE';

「対象データ0件時に出力ファイルを作成しないロジック」は、
単純に対象データのCountを先に取得し、0件であればファイル出力処理を
まるごとスキップすればよいのではないでしょうか?
ShigeX
会議室デビュー日: 2005/03/01
投稿数: 3
投稿日時: 2005-03-02 14:55
kanaiさん、ご回答感謝致します。バージョンはOracle8iです。早速ご提案を検証したいと思います。
1

スキルアップ/キャリアアップ(JOB@IT)