• ベストアンサー

PLSQLでファイルに書き込みをしたいけど出来ない。。

yu-jiの回答

  • ベストアンサー
  • yu-ji
  • ベストアンサー率19% (15/78)
回答No.1

久しぶりだし、コンパイルも通してないので合ってるかどうかわかりませんが。 CREATE OR REPLACE PROCEDURE Create_US_Company IS -- ファイルハンドル FILE_HANDLE UTL_FILE.FILE_TYPE; -- ファイルパス FILE_PATH VARCHAR2(100) := 'D:\tmp'; -- ファイル名 FILE_NAME VARCHAR2(100) := 'test.ddl'; -- 出力用文字列 STR VARCHAR2(200); BEGIN -- ファイルのオープン FILE_ID := UTL_FILE.FOPEN(FILE_PATH,FILE_NAME,'W'); STR := 'SAKURAKO'; -- ファイルへ出力 UTL_FILE.PUT(FILE_HANDLE,STR); -- 改行 UTL_FILE.NEW_LINE(FILE_HANDLE); -- ファイルのクローズ -- UTL_FILE.FCLOSE(FILE_HANDLE); END Create_US_Company; コンパイル通らなかったら改修お願いします。。。 実行できない場合は。。。どうしましょう??

nsakurako
質問者

お礼

☆ ありがとーございました。 早速、コンパイルして実行してみました。 1つだけ、エラーが出たので、下記のようにしてみましたが大丈夫でしょうか? -- ファイルのオープン FILE_ID := UTL_FILE.FOPEN(FILE_PATH,FILE_NAME,'W');  ↓↓ FILE_HANDLE := UTL_FILE.FOPEN(FILE_PATH,FILE_NAME,'W'); これで、バッチファイルを作成し、実行してみたのですが、 ログには、  ○プロシージャが作成されました。  ○エラーはありません。 とはなるのですが、ファイルへの書き込みはされていません。。。 何が悪いのでしょうか?? 実行のさせ方が変ですか???? どうかどうか、宜しくお願い致します。 ==バッチ============================== D: CD D:\work\ sqlplus -S test/test@test @test.sql > sakurako.log ==バッチ============================== ☆

関連するQ&A

  • ファイルへの書き込みができない

    ファイルへの書き込みができない 実行時エラーは表示されないのですが、ファイルへ出力されません。 コードは以下のようにしています。 よろしくお願いします。 declare FILE_HANDLE utl_file.file_type; STR varchar2(1023); begin -- 書き込みモードでファイルオープン FILE_HANDLE := UTL_FILE.FOPEN('c:\tmp','test.txt','W'); STR := 'test'; -- ファイルへ出力 UTL_FILE.PUT(FILE_HANDLE,STR); -- ファイルのクローズ -- UTL_FILE.FCLOSE(FILE_HANDLE); exception when others then dbms_output.put_line('その他エラー'); end; /

  • UTL_FILEエラー?

    Oracle10g(リンクをはっています) Winxp http://oshiete1.goo.ne.jp/kotaeru.php3?q=995849 を参考にして以下のようなプロシージャを作成しました。 CREATE OR REPLACE PROCEDURE test.Test_Convrt IS BEGIN DECLARE c1 number; c2 number; data1 varchar2(100) := null; data2 varchar2(100) := null; File_Handle UTL_FILE.FILE_TYPE; Read_Line VARCHAR2(1023); BEGIN File_Handle := utl_file.fopen('C:\temp', 'test.csv', 'r'); LOOP BEGIN UTL_FILE.GET_LINE(File_Handle, Read_line); -- カンマ位置 c1 := instr(Read_line,',',1,1); c2 := instr(Read_line,',',1,2); -- 列データ data1 := ltrim(substr(Read_line,1 ,c1-1)); data2 := ltrim(substr(Read_line,c1+1,c2-c1-1)); -- update update test.tbl1 set col1= data2 where col1= data1; commit; exception when no_data_found then exit; END; END LOOP; UTL_FILE.FCLOSE(File_Handle); END; END ; コンパイルは通るのですが、いざ実行しようとすると、 行1でエラーが発生しました。 : ORA-29280:invalid directory path ORA-06512 at "SYS.UTL_FILE", line 33 ORA-06512 at "SYS.UTL_FILE", line 436 ORA-06512 at "test.TEST_CONVRT", line 11 ORA-06512 at line 1 と表示されました。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1338675 も見てみたのですが、初心者なので、いまひとつ理解できません。 SYS.UTL_FILEを参照できていないということはなんとなく、わかりました。 どのようにすれば解決できるでしょうか? また、開発初心者なので、参考になるサイトが知りたいです。 どなたか、よろしくお願いします。

  • プロシージャの実行方法

    テキストファイル(test.txt)から文字列を一行ずつ読み込んでDBMS_OUTPUTで表示を最後の行まで繰り返すプロシージャを作りたいのですが、プロシージャ制作までは出来るのですがプロシージャの実行が出来ません。 原因が理解できないのですが返答をお願いします。 create or replace procedure TXT_R as FH UTL_FILE.FILE_TYPE; V_LINE VARCHAR2(32767); BEGIN FH := UTL_FILE.FOPEN('DATA_PUMP_DIR','test.txt','R'); LOOP UTL_FILE.GET_LINE(FH,V_LINE); DBMS_OUTPUT.PUT_LINE(V_LINE); END LOOP; EXCEPTION WHEN NO_DATA_FOUND THEN UTL_FILE.FCLOSE(FH); END TXT_R; ここまでプロシージャです。 そしてネットで調べた結果引数が無い時は書かなくていいと書かれていたのですが、 exec TXT_R; で実行すると ORA-00900: SQL文が無効です。 となってしまいます。

  • CSVファイルを読み込んでテーブルの更新

    こんばんは。 oracle9iでPL/SQLを使用して、CSVファイルを 読み込んで、テーブルの更新を行いたいと 思っています。 CSVファイル、テーブル共に最初の2つがキー項目です。 ■CSVファイル 001, 111, 10000, 20000 002, 222, 30000, 40000 ・・・・・ ・・・・・ 009, 999, 55555, 55555 ■テーブル 001, 111, 99999, 99999 002, 222, 99999, 99999 ・・・・・ ・・・・・ 009, 999, 99999, 99999 ■テーブル(処理後) 001, 111, 10000, 20000 002, 222, 30000, 40000 ・・・・・ ・・・・・ 009, 999, 55555, 55555 わかったのは、CSVファイルを行単位で読み込む所までです。 DECLARE   File_Handle UTL_FILE.FILETYPE; Read_Line VARCHAR2(1023); BEGIN File_Handle := UTL.FILE.FOPEN('dir', 'file', 'r'); BEGIN LOOP UTL.FILE.GETLINE(File_Handle, Read_line); END LOOP; END; UTL.FILE.FCLOSE(File_Handle); END; 1行を読み込んだのはいいけど、この後がよくわかりません。テーブルを更新する所とあわせて、ご教示ください。

  • UTL_FILEパッケージについて

    UTL_FILEパッケージを使用してPL/SQLよりテキスト出力したいのですが上手くいきません。 まずsysdbaにて「create directory aaa as 'd:\'」にてディレクトリを作成しました。 次に以下のようにプロシージャを作成しました。 create procedure kan_exp( fir IN varchar2, filename IN varchar2) is file UTL_FILE.FILE_TYPE; CURSOR tk01_kan_c IS select aaa,bbb from tableCCC begin file := UTL_FILE.FOPEN(dir, filename, 'w'); UTL_FILE.PUT_LINE(file, 'TEST'); UTL_FILE.NEW_LINE(file); for kanrec in tk01_kan_c loop UTL_FILE.PUT_LINE(file, 'TEST'); end loop; END kan_exp; / それを以下のように呼び出しましたが、 execute kan_exp('UTL_FILE_DIR', 'aaa.csv'); 「ORA-29280:無効なディレクトリパスです。」エラーが発生します。 色々と調べてユーザに権限が必要かと思い、「grant read on directory to User」としましたが、ユーザーまたはロール'User'は存在しませんと出てきます。※もちろんUserは存在します。 なにか足りないものがあるのでしょうか? ご教示いただけますでしょうか?宜しくお願いします。

  • ORA-29280:無効なディレクトリ・パスです

    Oracle初心者です。 機器更新によるシステム移行を行っているのですが、 Oracleより、抽出データをCSVに出力する、プロシージャにて、 「ORA-29280: 無効なディレクトリ・パスです。」 のエラーが出て対処法が分からずに困っています。 以下、プロシージャ部分抜粋 -------------------------------------------------------------------------------- fno1 utl_file.file_type := utl_file.fopen('EXPORT_DIR','TEST1.csv', 'W'); fno2 utl_file.file_type := utl_file.fopen('EXPORT_DIR','TEST2.csv', 'W'); -------------------------------------------------------------------------------- 上記の、「EXPORT_DIR」とは、どこで定義されている変数(?)なのでしょうか? なんとなく、EXPORT_DIRが正しくないためのエラーと考えているのですが… 処理の流れとしては、TEST.bat → TEST.sql → プロシージャ  で、 TEST.batには試しに、SET EXPORT_DIR = D:\TEST としてみたのですが、エラーのままでした。 ひょっとして、Oracleに設定すべきもの? すみませんが、どこでどのように定義するか教えてください。 環境: Oracle11g WindowsServer2008R2

  • PL/SQLのプロシージャが動かない

    テキストファイル(test.txt)から文字列を一行ずつ読み込んでDBMS_OUTPUTで表示を最後の行まで繰り返すプロシージャを作りたいのですが、declareで実行する時は何の問題も出ないのにプロシージャを作ろうとするとエラーが発生します。 原因が理解できないのですが返答をお願いします。 create or replase procedure TXT_R as FH UTL_FILE.FILE_TYPE; V_LINE VARCHAR2(32767); BEGIN FH := UTL_FILE.FOPEN('DATA_PUMP_DIR','test.txt','R'); LOOP UTL_FILE.GET_LINE(FH,V_LINE); DBMS_OUTPUT.PUT_LINE(V_LINE); END LOOP; EXCEPTION WHEN NO_DATA_FOUND THEN UTL_FILE.FCLOSE(FH); END; 実行すると ORA-00905: キーワードがありません。 のエラ-が出ます

  • PL/SQL-プロシージャ

    プロシージャBはテスト実行のため、プロシージャAを真似て作成しています。 --最後のIF文で、プロシージャAかBのどちらかに走らせたいと思っています。 DECLARE --プロシージャA--------------------------------------- PROCEDURE A IS fno1 utl_file.file_type; dnm1 varchar(200) :='XXX'; fnm1 varchar2(200) :='BBB.txt'; CURSOR cu1 is select XYZ as ABC from CCC; BEGIN fno1 := utl_file.fopen(dnm1,fnm1,'w'); FOR CU1_REC1 in CU1 loop utl_file_put_line(fno1,' '|| CU1_REC1.XYZ END LOOP; utl_file.fclose(fno1); end; --プロシージャB------------------------------------- プロシージャAと似たような処理 --プロシージャAかBかを判定するIF文------------------------------ BEGIN IF CCC.ABC = '0'; THEN A; ELSE B; ENDIF; END; /

  • PL/SQLでCSVを作成又は、読み込みたい

    下記のエラーが出て、UTL_FILEパッケージが使用できません。なぜでしょう? 下記SQL文の「※1」箇所で「UTL_FILE」の後 「.」を入力しても、「FILE_TYPE」は選択肢には表示されず、やむを得ず手入力しました。 ~~~~~~~~~~~~~~~~~~~~~~~ 問題のSQL文 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ DECLARE  DNM VARCHAR2(200) := 'C:\TMP';  FNM VARCHAR2(200) := 'TEST.CSV';  CURSOR CUR1 IS      SELECT COL1, COL2, COL3, COL4, COL5     FROM A;  FHANDLE UTL_FILE.FILE_TYPE;  ←←←←←←←←←←  ※1  REC VARCHAR2(2000); BEGIN  FHANDLE := UTL_FILE.FOPEN(DNM,FNM,'W',2002);  UTL_FILE.PUTF(FHANDLE,'"%S","%S","%S","%S"\N','タイプ','オブジェクト','作成日','更新日');    BEGIN    FOR CUR_REC IN CUR1 LOOP    UTL_FILE.PUTF(FHANDLE,'"%S","%S","%S","%S"\N','タイプ','オブジェクト','作成日','更新日');   END LOOP;  END;  UTL_FILE.FCLOSE(FHANDLE); END; ~~~~~~~~~~~~~~  エラーメッセージ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Error [row:1,col:1] ORA-06510: PL/SQL: ユーザー定義の例外が発生しましたが、処理されませんでした ORA-06512: "SYS.UTL_FILE", 行120 ORA-06512: "SYS.UTL_FILE", 行293 ORA-06512: 行14

  • PL/SQL文にて

    PL/SQL文にて、コーディングをしています。意図した通りにプログラムは動作するのですが、ファイルに何のデータも入ってこない場合の分岐処理を加えて、データが入ってこなかった場合にはファイルは作成しないというロジックを検討しています。どなたかうまいやり方をご存知無いでしょうか? --略-- --ファイル名設定 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; --略--