3

我正在尝试将文件作为 blob 读入我的 oracle 表中。该文件是 *.gz 数据。我环顾了“网络”并找到了一些示例,这就是我想出的:

创建或替换 PROCEDURE upload_supp_data
是
   src_file BFILE;
   dst_file BLOB;
   lgh_file BINARY_INTEGER;
   data_dir varchar2(20) := '/tmp/';
   文件名 varchar2(50) := '200912020200.rep-ids-top50-sip.txt.gz';
开始

   src_file := BFILENAME (data_dir, file_name);

   -- 插入 NULL 记录以锁定
   插入警报_补充
               (alarm_id、resource_id、补充数据
               )
        值 (13794740, 1, EMPTY_BLOB ()
               )
     返回补充数据
          进入 dst_file;

   -- 锁定记录
   选择补充数据
         INTO dst_file
         来自警报_补充
        其中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 字段
     更新警报_补充
      SET 补充数据 = dst_file
    其中 ALARM_ID = 13794740;

   -- 关闭文件
   DBMS_LOB.fileclose (src_file);
结束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'。文件名是正确的,所以我不知道出了什么问题。这实际上是我写过的第一个存储过程,所以这可能是一件非常简单的事情。我希望有人可以帮助我。顺便说一句,我正在使用 Oracle SQL Developer。

4

3 回答 3

5

您需要 DBA 执行以下操作:

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

然后在/tmp/你的代码中,你会放brian_tmp. DBA 可能不想让您访问所有内容/tmp(因为您的用户现在可以在该目录中做任何事情,伪装成 Oracle 正在运行的 Unix 用户)在这种情况下,您需要一个子目录。

于 2011-07-12T20:26:12.387 回答
4

您需要 DBA 在 Oracle 中创建 Directory 对象(而不是磁盘上的目录)。就像是:

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 回答