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
;但是你真的不应该在那个模式中工作。
我正在尝试将 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
;但是你真的不应该在那个模式中工作。