ORA-22285: FILEOPEN 操作的目录或文件不存在

ORA-22285: non-existent directory or file for FILEOPEN operation

我正在尝试将 XML 文件的代码插入 XML 类型

的列中

我有以下查询工作正常

select extract(xmlcol,'/*') 
   from (SELECT xmltype(BFILENAME('MEDIA_DIR', 'xmldata1.xml'),nls_charset_id('UTF-8')) xmlcol FROM dual)

在 运行 执行此查询时,我在一行中获取 xml 文件(xmldata1)中的 Xmlcode。

现在,根据我的要求,我创建了一个从 XML 文件中读取数据的类型。 下面是该类型的成员函数代码:

create or replace type body t_emp
as

    member function get_xml return xmltype is
    v_xml xmltype;
    begin
    select extract(xmlcol,'/*') into v_xml
       from (SELECT xmltype(BFILENAME('MEDIA_DIR', 'xmldata1.xml'),nls_charset_id('UTF-8')) xmlcol FROM dual);
    return v_xml;
    end get_xml;
end;

我在我的代码中调用了这个类型的成员函数。下面是代码

declare
t_emp1 t_emp; 
r1 xmltype;
begin
t_emp1 := t_emp(2);
r1 := t_emp1.get_xml;
insert into EMPLOYEE_XML values (t_emp1.id,r1);
end;

这里变量 r1 很重要,因为我正在这个变量中获取 XML 数据。 在 运行 宁这个代码我得到以下错误:

ORA-22285: non-existent directory or file for FILEOPEN operation

我无法理解为什么在目录存在时出现此错误。我能够运行前面提到的SQL查询。

谢谢!!

您正在创建类型的用户仅对通过角色授予的目录对象具有权限。默认情况下,存储的 PL/SQL 块不会继承角色的权限。当你运行 SQL 直接启用该角色;当您 运行 通过 PL/SQL 成员函数时,角色被禁用并且您的用户看不到该目录。您需要将目录权限直接授予您的用户。

在您的情况下,您在 SYSTEM 架构中工作(因此目录权限是通过 EXP_FULL_DATABASE 角色获得的,该角色来自 DBA),这是个坏主意;在该模式(或任何内置模式)中创建对象不是好的做法,因此直接向 `SYSTEM 授予权限在这里也是一个错误。

您应该使用所需的最低权限创建一个新的 user/schema。您已经创建了目录对象,因此新用户设置将包括:

grant read,write on media_dir to your_new_user;

然后您可以在该新架构中创建该类型及其成员函数,并且您将能够从您的匿名块中执行它。

如果您只能通过角色授予权限,那么您可以将类型声明更改为 use invoker's rights

create or replace type t_emp authid current_user as object ...

这甚至适用于您当前的情况,坚持使用 SYSTEM;但是你真的不应该在那个模式中工作。