下面是我用来将数据从表提取到平面文件的代码。
BEGIN
DECLARE
file_name VARCHAR2(50);
file_handle utl_file.file_type;
BEGIN
file_name := 'table.txt';
file_handle := utl_file.fopen('SEND',file_name,'W');
FOR rec in(
SELECT column 1
||'~'||column 2
||'~'||column 3 out_line
FROM table1)LOOP
UTL_FILE.PUT_LINE(file_handle,rec.out_line);
UTL_FILE.FFLUSH(file_handle);
END LOOP;
UTL_FILE.FCLOSE(file_handle);
END;
end;
这段代码在我们的开发数据库中运行良好,但是如果我在一个新的数据库中执行,它会抛出下面的错误。
x一个一个一个一个x一个一个二个x
请帮我解决这个问题。
伙计们,请让我知道,如果你需要更多的数据从我这里来解决这个问题。
6条答案
按热度按时间p5fdfcr11#
所以,@Vivek通过评论中的对话而不是通过实际的答案来解决问题。
用户
oracle
正在创建该文件,刚刚在我们的开发数据库中注意到这一点。我收到此错误是因为,我尝试创建该文件的目录没有others
的写入权限,而用户oracle
属于others
类别。谁说这是一个问答网站而不是一个论坛?呃,我,还有其他人。无论如何,在这个问题没有一个公认的答案的情况下,我提供了一个链接,指向我关于
UTL_FILE.FOPEN()
主题的答案。在这里找到它。注:我把这个答案标记为社区Wiki,因为它不是这个问题的正确答案,只是一个重定向到其他地方。
cdmah0mi2#
假设已在预定义目录中创建了名为“
table.txt
“的文件现在,试试应该管用!
jgovgodb3#
在Windows上也检查文件是否没有使用EFS加密。我有同样的问题,直到我手动解密文件。
omhiaaxx4#
我已经面临这个问题两天了,我发现您在Oracle中创建的目录也需要首先在您的物理磁盘上创建。
我没有发现这一点提到的任何地方,我试图寻找解决这个问题。
示例
如果您创建了一个目录,例如'
DB_DIR
'。然后,您需要确保
DB_WORKS
存在于E:\
驱动器中,并且Oracle进程具有文件系统级别的读/写权限。下面给出了我根据自己的经验对UTL_FILE进行此类操作的理解。
UTL_FILE是SYS用户下的对象。允许在SYS上执行。UTL_FILE TO PUBLIC;需要在以SYS登录时给定,否则会在过程中出现声明错误,任何人都可以创建一个目录,如下所示:-CREATE OR REPLACE DIRECTORY DB_DIR AS 'E:\DBWORKS';但是CREATE DIRECTORY权限应该是适当的,可以按如下方式授予:-GRANT CREATE ALL DIRECTORY TO user;以SYS用户身份登录时。但是,如果需要由其他用户使用,则需要向该用户授予权限,否则将引发错误。GRANT READ,WRITE,EXECUTE ON DB_DIR TO user;同时以创建目录的用户身份登录。然后,编译您的包。在执行此过程之前,请确保目录实际存在于磁盘上。2否则将引发"无效文件操作"错误。(重要)确保Oracle进程具有文件系统级别的读/写权限。该权限独立于授予的数据库级别权限。(重要提示)执行过程。文件应该被你的查询结果集填充。
3z6pesqy5#
如果尝试在文本模式下写入比
max_linesize
长的行,则ORA-29283: invalid file operation
也会在utl_file.put
上引发。max_linesize
是utl_file.fopen
函数的可选第4个参数,默认值为1024。(My一个案例是dumping CSV从Docker中的Oracle进入Map为Docker卷的主机目录中的文件,我被这个错误误导了相当长的时间-我在Docker和主机之间的文件系统权限或卷Map中寻找原因,实际上这是一个愚蠢的原因。)
更新:在
utl_file.fopen
上也发生了另一个相同的异常。数据库拒绝创建文件,即使该文件以前不存在。尝试创建文件的目录Map到Docker卷上。如果事先在主机上创建了大小为零的文件,则该目录开始工作。尝试从容器中创建文件(touch /dir/file
)失败了。可能是一些Docker问题-它在重新启动Docker Desktop后消失了。wsewodh26#
1.您需要通过创建文件夹来授予权限。
1.将目录DINESH创建或替换为"/home/oracle/DINESH/";
1.将目录DINESH上的读、写授权给public;
1.简单的PLSQL来打开一个文件,--在文件中写入两行,--然后关闭文件declare
文件类型;
Begin
utl_file. put(fhandle,'你好,世界!'||人权委员会(10));
例外
结束;
1.在/home/oracle/DINESH中创建的test_file. txt文件。