27

vin1.txtという名前のc:\ドライブに保存されているファイルに書き込もうとしていますが、このエラーが発生します。提案してください。

> ERROR at line 1: ORA-29280: invalid
> directory path ORA-06512: at
> "SYS.UTL_FILE", line 18 ORA-06512: at
> "SYS.UTL_FILE", line 424 ORA-06512: at
> "SCOTT.SAL_STATUS", line 12 ORA-06512:
> at line 1

ここにコードがあります

  create or replace procedure sal_status
   (
    p_file_dir IN varchar2,
    p_filename IN varchar2)
     IS  
    v_filehandle utl_file.file_type;
    cursor emp Is
        select * from employees
        order by department_id;
    v_dep_no departments.department_id%TYPE;
     begin
         v_filehandle :=utl_file.fopen(p_file_dir,p_filename,'w');--Opening a file
         utl_file.putf(v_filehandle,'SALARY REPORT :GENERATED ON %s\n',SYSDATE);
         utl_file.new_line(v_filehandle);
         for v_emp_rec IN emp LOOP
            v_dep_no :=v_emp_rec.department_id;
            utl_file.putf(v_filehandle,'employee %s earns:s\n',v_emp_rec.last_name,v_emp_rec.salary);                    
         end loop;
        utl_file.put_line(v_filehandle,'***END OF REPORT***');
        UTL_FILE.fclose(v_filehandle);
     end sal_status;

execute sal_status('C:\','vin1.txt');--Executing
4

6 に答える 6

43

Oracle 9i 以降、UTL_FILE で使用するディレクトリを宣言する方法は 2 つあります。

古い方法は、INIT.ORA パラメータ UTL_FILE_DIR を設定することです。変更を有効にするには、データベースを再起動する必要があります。値は、他の PATH 変数と同様です。ワイルドカードを受け入れます。このアプローチを使用すると、ディレクトリパスを渡すことを意味します...

UTL_FILE.FOPEN('c:\temp', 'vineet.txt', 'W');

もう 1 つの方法は、ディレクトリ オブジェクトを宣言することです。

create or replace directory temp_dir as 'C:\temp'
/

grant read, write on directory temp_dir to vineet
/

ディレクトリ オブジェクトは正確なファイル パスを必要とし、ワイルドカードを受け入れません。このアプローチでは、ディレクトリ オブジェクト名を渡します...

UTL_FILE.FOPEN('TEMP_DIR', 'vineet.txt', 'W');

UTL_FILE_DIR は本質的に安全ではないため非推奨です。パスで指定されたすべての OS ディレクトリにすべてのユーザーがアクセスできますが、読み取り権限と書き込み権限は個々のユーザーに個別に付与されます。また、Directory オブジェクトを使用すると、データベースをバウンスすることなく、ディレクトリを追加、削除、または変更できます。

いずれの場合も、 OS ユーザーは OS ディレクトリに対するoracle読み取りおよび/または書き込み権限を持っている必要があります。明らかでない場合、これはディレクトリがデータベースサーバーから見える必要があることを意味します。そのため、ローカル PC 上のディレクトリをリモート データベース サーバー上で実行されているプロセスに公開するために、どちらの方法も使用できません。ファイルは、データベース サーバーまたは共有ネットワーク ドライブにアップロードする必要があります。


oracleOS ユーザーが OS ディレクトリに対する適切な権限を持っていない場合、またはデータベースで指定されたパスが実際のパスと一致しない場合、プログラムは次の例外をスローします。

ORA-29283: invalid file operation
ORA-06512: at "SYS.UTL_FILE", line 536
ORA-29283: invalid file operation
ORA-06512: at line 7

このエラーの OERR テキストは非常に明確です。

29283 -  "invalid file operation"
*Cause:    An attempt was made to read from a file or directory that does
           not exist, or file or directory access was denied by the
           operating system.
*Action:   Verify file and directory access privileges on the file system,
           and if reading, verify that the file exists.
于 2010-05-02T13:22:32.820 に答える
14

また、ファイルのパスが実際の Oracle サーバー マシン上にあり、ストアド プロシージャを呼び出している可能性のあるローカル開発マシン上にないことも忘れないでください。これはおそらく非常に明白ですが、覚えておくべきことです。

于 2015-01-30T23:26:16.853 に答える
6

ディレクトリをOracleに登録する必要があります。fopenは、パスではなく、ディレクトリオブジェクトの名前を取ります。例えば:

(これらを実行するには、SYSとしてログインする必要がある場合があります)

CREATE DIRECTORY MY_DIR AS 'C:\';

GRANT READ ON DIRECTORY MY_DIR TO SCOTT;

次に、fopenの呼び出しでそれを参照できます。

execute sal_status('MY_DIR','vin1.txt');
于 2010-05-02T07:55:13.040 に答える
1

アクセスするディレクトリを「utl_file_dir」パラメータに追加して、DBAにinit.oraファイルを変更させる必要があります。init.oraはデータベースが起動したときにのみ読み取られるため、データベースインスタンスを停止して再起動する必要があります。

次のクエリを実行すると、このパラメータを表示できます(変更はできません)。

SELECT *
  FROM V$PARAMETER
  WHERE NAME = 'utl_file_dir'

共有してお楽しみください。

于 2010-05-01T23:06:39.350 に答える
1

For utl_file.open(location,filename,mode) , we need to give directory name for location but not path. For Example:DATA_FILE_DIR , this is the directory name and check out the directory path for that particular directory name.

于 2015-05-14T11:04:47.493 に答える