【问题标题】:How to use a stored procedure to read a file into an oracle DB如何使用存储过程将文件读入 oracle DB
【发布时间】:2011-10-03 22:03:03
【问题描述】:

我正在尝试将文件作为 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。

【问题讨论】:

    标签: oracle stored-procedures blob ora-06512


    【解决方案1】:

    您需要 DBA 来做:

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

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

    【讨论】:

      【解决方案2】:

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

      CREATE DIRECTORY admin AS 'oracle/admin';
      

      然后授予目录权限;像其他模式对象一样(视图、包等)

      【讨论】:

      • 我应该举一个你的价值观的例子。让我更新我的答案。
      • @DCookie 举了一个例子。
      【解决方案3】:

      除了其他答案,请注意,当您使用目录时,例如:

      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';
      

      【讨论】:

        猜你喜欢
        • 2020-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-04
        • 1970-01-01
        • 1970-01-01
        • 2012-03-22
        • 2010-11-08
        相关资源
        最近更新 更多