如何使用存储过程将文件读取到oracle数据库中



我正试图将一个文件作为blob读取到我的oracle表中。该文件是*.gz数据。我环顾网络,发现了一些例子,这就是我想到的:

创建或替换PROCEDURE upload_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记录插入警报_补充(alarm_id,resource_id,supplementaldata)值(13794740,1,EMPTY_bob(()返回补充数据INTO 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 supplementaldata=dst_file其中ALARM_ID=13794740;--关闭文件DBMS_LOB.fileclose(src_file(;结束上传_上传_数据;

当我运行这个时,我会得到以下错误:

ORA-22285:FILEOPEN操作的目录或文件不存在ORA-06512:在"SYS.DBMS_LAB",第635行ORA-06512:在"AIP_DBA.UPLOAD_SUPP_DATA",第29行ORA-06512:在2号线进程已退出。

我用各种方式处理过路径,例如"/tmp/"、"tmp"、"/tmp"。文件名是正确的,所以我不知道出了什么问题。这实际上是我写过的第一个存储过程,所以这可能是一件非常简单的事情。我希望有人能帮我。顺便说一下,我使用的是Oracle SQL Developer。

您需要DBA执行以下操作:

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

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

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

CREATE DIRECTORY admin AS 'oracle/admin';

然后将权限授予该目录;像其他模式项目一样(视图、包等(

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

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

相关内容

  • 没有找到相关文章

最新更新