Database utl#u file.fopen不带';创建目录。。。作为…';

Database utl#u file.fopen不带';创建目录。。。作为…';,database,oracle,file-io,plsql,utl-file,Database,Oracle,File Io,Plsql,Utl File,大家好。 我不熟悉PL/SQL和Oracle数据库。 我需要读取/写入服务器上存在的文件,因此我使用的是utl_file.fopen('/home/tmp/','text.txt','R'),但Oracle显示错误“目录路径无效” 主要问题是我只有用户权限,所以我不能使用像以下命令:create directory user\u dir as'/home/temp/'或仅使用show参数utl\u file\u dir查看utl\u file\u dir 我使用此代码查看utl\u文件\u目录:

大家好。 我不熟悉PL/SQL和Oracle数据库。 我需要读取/写入服务器上存在的文件,因此我使用的是
utl_file.fopen('/home/tmp/','text.txt','R')
,但Oracle显示错误“目录路径无效”

主要问题是我只有用户权限,所以我不能使用像以下命令:
create directory user\u dir as'/home/temp/'
或仅使用
show参数utl\u file\u dir查看utl\u file\u dir
我使用此代码查看utl\u文件\u目录:

SQL> set serveroutput on;
SQL> Declare
  2      Intval number;
  3      Strval varchar2 (500);
  4      Begin
  5       If (dbms_utility.get_parameter_value('utl_file_dir', intval,strval)=0)
  6      Then dbms_output.put_line('value ='||intval);
  7      Else dbms_output.put_line('value = '||strval);
  8      End if;
  9      End;
 10  /
输出为“值=0”

我在谷歌上搜索了很多,但是没有找到任何解决这个问题的方法,所以我在这里寻求帮助

要读取文件,我使用以下代码:

    declare
    f utl_file.file_type;
    s varchar2(200);
begin
    f := utl_file.fopen('/home/tmp/','text.txt','R');
    loop
        utl_file.get_line(f,s);
        dbms_output.put_line(s);
    end loop;
exception
    when NO_DATA_FOUND then
        utl_file.fclose(f);
end;

如果您没有创建目录对象的权限(并且假设目录对象不存在),则需要向DBA(或具有相应权限的其他人)发送请求,以便为您创建目录并授予您访问该目录的权限


utl_file_dir
是一个过时的参数,它比目录对象灵活得多,需要重新启动数据库才能更改,除非您使用的是Oracle 8.1.x,或者您处理的是一个在8.1.x天内写回的旧进程,并且没有更新为使用目录,您应该忽略它。

谢谢您的回答,但我如何使用pl sql读取文件?我可以在shell中使用mkdir和cat命令,但不能使用sqlplus创建目录。@AlexeevMichael-如果您想从PL/SQL读取文件(记住,它只能访问数据库服务器文件系统上的文件),需要授予您适当的权限。有人(可能是您的DBA)实际需要创建目录对象并授予您对它的访问权。您的操作系统帐户具有创建操作系统目录的权限这一事实并不直接相关(尽管如果您想向DBA请求
创建目录
权限,您可以使用它)。非常感谢您的回答