3

ファイルをBLOBとしてOracleテーブルに読み込もうとしています。ファイルは*.gzデータです。私はネットを見回していくつかの例を見つけました、そしてこれは私が思いついたものです:

PROCEDUREupload_supp_dataを作成または置換します
は
   src_file BFILE;
   dst_file BLOB;
   lgh_file BINARY_INTEGER;
   data_dir varchar2(20):='/ tmp /';
   file_name varchar2(50):= '200912020200.rep-ids-top50-sip.txt.gz';
始める

   src_file:= BFILENAME(data_dir、file_name);

   -ロックするNULLレコードを挿入します
   INSERT INTO alarms_supplemental
               (alarm_id、resource_id、supplementaldata
               )。
        値(13794740、1、EMPTY_BLOB()
               )。
     補足データを返す
          INTO dst_file;

   -ロックレコード
   補足データを選択
         INTO dst_file
         FROM alarms_supplemental
        WHERE alarm_id = 13794740
   更新用;

   -ファイルを開きます
   DBMS_LOB.fileopen(src_file、DBMS_LOB.file_readonly);
   -長さを決定します
   lgh_file:= DBMS_LOB.getlength(src_file);
   -ファイルを読む
   DBMS_LOB.loadfromfile(dst_file、src_file、lgh_file);

   --blobフィールドを更新します
     ALARMS_SUPPLEMENTALを更新
      SET Supplementaldata = dst_file
    WHERE ALARM_ID = 13794740;

   -ファイルを閉じる
   DBMS_LOB.fileclose(src_file);
END upload_supp_data;

これを実行すると、次のエラーが発生します。

ORA-22285:FILEOPEN操作用のディレクトリまたはファイルが存在しません

ORA-06512:「SYS.DBMS_LOB」の635行目

ORA-06512:「AIP_DBA.UPLOAD_SUPP_DATA」の29行目

ORA-06512:2行目

プロセスが終了しました。

パスをさまざまな方法で試しました。つまり、「/ tmp /」、「tmp」、「/tmp」です。ファイル名が正しいので、何が悪いのか途方に暮れています。これは実際に私がこれまでに作成した最初のストアドプロシージャであるため、これは非常に単純なことかもしれません。誰かがこれを手伝ってくれることを願っています。ちなみに、私はOracleSQLDeveloperを使用しています。

4

3 に答える 3

5

DBA は次のことを行う必要があります。

CREATE DIRECTORY brian_tmp AS '/tmp';
GRANT READ, WRITE ON DIRECTORY brian_tmp TO brian;

次に、/tmp/コードの の代わりに、 を置きbrian_tmpます。/tmpDBA は、 (Oracle が実行されている Unix ユーザーになりすましてそのディレクトリ内でユーザーが何でもできるようになったため)すべてへのアクセス権を付与したくない場合があります。この場合、サブディレクトリが必要になります。

于 2011-07-12T20:26:12.387 に答える
4

Oracle にディレクトリ オブジェクトを作成するには、DBA が必要です (ディスク上のディレクトリではありません)。何かのようなもの:

CREATE DIRECTORY admin AS 'oracle/admin';

次に、ディレクトリに権限が付与されます。他のスキーマ オブジェクトと同様に (ビュー、パッケージなど...)

于 2011-07-12T19:10:41.743 に答える
2

他の回答に加えて、ディレクトリを使用する場合は次のように注意してください。

CREATE DIRECTORY my_dir as '/tmp';
GRANT READ, WRITE ON DIRECTORY my_dir TO this_user;
...
data_dir varchar2(20) := 'MY_DIR';

ディレクトリ名は、CREATE ステートメントで二重引用符を使用して小文字で特別に作成しない限り、大文字にする必要があります。

CREATE DIRECTORY "My_Dir" AS '/tmp';

その場合、SQL では常に二重引用符で名前を参照する必要があり、適切な場合はプログラムによる参照で参照する必要があります。

GRANT READ, WRITE ON DIRECTORY "My_Dir" TO this_user;
...
data_dir varchar2(20) := 'My_Dir';
于 2011-07-12T21:17:39.273 に答える