我正在尝试将XML文件的代码插入到XMLtype
的列中我在下面查询哪个工作正常
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查询。
谢谢!
答案 0 :(得分:1)
您创建类型的用户仅对通过角色授予的目录对象具有权限。默认情况下,存储的PL / SQL块不会继承角色权限。直接运行SQL时,角色已启用;当您通过PL / SQL成员函数运行时,该角色被禁用,并且该目录对您的用户不可见。您需要直接向您的用户授予目录权限。
在您的情况下,您正在使用SYSTEM
架构(因此目录权限来自EXP_FULL_DATABASE
的{{1}}角色,这是一个坏主意;在该模式(或任何内置模式)中创建对象不是一个好习惯,因此直接向`SYSTEM授予特权也是一个错误。
您应该使用所需的最低权限创建新的用户/架构。您已经创建了目录对象,因此新用户设置将包括:
DBA
然后,您可以在新架构中创建类型及其成员函数,并且您将能够从匿名块中执行它。
如果您只能通过角色授予权限,则可以将类型声明更改为use invoker's rights
grant read,write on media_dir to your_new_user;
这甚至适用于您当前的情况,坚持使用create or replace type t_emp authid current_user as object ...
;但是你真的不应该在那个模式中工作。