2011-07-12 26 views
2

blobとしてoracleテーブルにファイルを読み込もうとしています。ファイルは* .gzデータです。私はこれを実行すると、私はこれらのエラーを取得ストアドプロシージャを使用してOracleデータベースにファイルを読み込む方法

 
create or replace PROCEDURE upload_supp_data 
IS 
    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'; 
BEGIN 

    src_file := BFILENAME (data_dir, file_name); 

    -- insert a NULL record to lock 
    INSERT INTO alarms_supplemental 
       (alarm_id, resource_id, supplementaldata 
       ) 
     VALUES (13794740, 1, EMPTY_BLOB() 
       ) 
    RETURNING supplementaldata 
      INTO dst_file; 

    -- lock record 
    SELECT supplementaldata 
     INTO dst_file 
     FROM alarms_supplemental 
     WHERE alarm_id = 13794740 
    FOR UPDATE; 

    -- open the file 
    DBMS_LOB.fileopen (src_file, DBMS_LOB.file_readonly); 
    -- determine length 
    lgh_file := DBMS_LOB.getlength (src_file); 
    -- read the file 
    DBMS_LOB.loadfromfile (dst_file, src_file, lgh_file); 

    -- update the blob field 
    UPDATE ALARMS_SUPPLEMENTAL 
     SET supplementaldata = dst_file 
    WHERE ALARM_ID = 13794740; 

    -- close file 
    DBMS_LOB.fileclose (src_file); 
END upload_supp_data; 

 
ORA-22285: non-existent directory or file for FILEOPEN operation 

ORA-06512: at "SYS.DBMS_LOB", line 635 

ORA-06512: at "AIP_DBA.UPLOAD_SUPP_DATA", line 29 

ORA-06512: at line 2 

Process exited. 

私がプレイした私は、「ネットの周りを見て、いくつかの例を発見し、これは私が作ってみたものです'/ tmp /'、 'tmp'、 '/ tmp'など、さまざまな方法でパスを囲んでいます。ファイル名は正しいので、何が間違っているのか分かりません。これは実際に私が今までに書いた最初のストアドプロシージャなので、これは本当に簡単なことかもしれません。誰かが私にこれを手伝ってくれることを願っている私はOracle SQL Developerを使用しています。

答えて

3

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

CREATE DIRECTORY admin AS 'oracle/admin'; 

次に、ディレクトリにアクセス許可が与えられます。他のスキーマOjbectsのように(ビュー、パッケージなど)

+0

私はあなたの値で例を挙げておくべきです。私の答えを更新させてください。 –

+0

@DCookieが例を挙げました。 –

4

あなたがするDBAが必要になります:

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

次に、あなたのコード内の/tmp/の代わりに、あなたはbrian_tmpを入れてしまうでしょう。 DBAは/tmpのすべてにアクセスすることを望んでいないかもしれません(あなたのユーザーはOracleのユーザーが実行されているので、そのディレクトリで何かを行うことができるようになります)。その場合はサブディレクトリが必要です。

2

他の回答、あなたのディレクトリを使用する場合なお、例えばに加えて:具体的に二重引用符の使用を経由して小文字で作成していない限り

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

ディレクトリ名は大文字でなければなりませんCREATE文:

あなたは常にSQLで二重引用符で、およびプログラムreferecesで適切な場合には名前を参照する必要があると思います。その場合には
CREATE DIRECTORY "My_Dir" AS '/tmp'; 

GRANT READ, WRITE ON DIRECTORY "My_Dir" TO this_user; 
... 
data_dir varchar2(20) := 'My_Dir'; 
関連する問題