如何使用存储过程将文件读入 oracle DB

Laz*_*man 3 oracle stored-procedures blob ora-06512

我正在尝试将文件作为 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记录进行锁定
   INSERT INTO alarms_supplemental
               (alarm_id, resource_id, 补充数据
               )
        值 (13794740, 1, EMPTY_BLOB ()
               )
     返回补充数据
          进入 dst_file;

   -- 锁定记录
   选择补充数据
         进入 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 补充数据 = dst_file
    WHERE ALARM_ID = 13794740;

   -- 关闭文件
   DBMS_LOB.fileclose (src_file);
ENDupload_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。

Gai*_*ius 5

您需要 DBA 执行以下操作:

CREATE DIRECTORY brian_tmp AS '/tmp';
GRANT READ, WRITE ON DIRECTORY brian_tmp TO brian;
Run Code Online (Sandbox Code Playgroud)

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