我正在尝试使用以下过程使用pl/sql编写一个xml文件 dbms_xmldom.writetofile
. 但是,上面的代码只有在我提供从 DBA_DIRECTORIES
如下所示:
procedure PRINT_XML (p_xml xmltype
,p_requestid number)
is
l_filename varchar2(100);
doc dbms_xmldom.domdocument;
l_directory request_history.OUTPUTWORKDIRECTORY%type;
l_dml_stmnt request_history.OUTPUTWORKDIRECTORY%type;
begin
l_filename := 'JPK_Accounting_Books_'||g_jpk_ess_request_id||'.xml';
doc := dbms_xmldom.newdomdocument(p_xml);
dbms_xmldom.writetofile(doc, 'TMP/'||l_filename);
dbms_xmldom.freeDocument(doc);
EXCEPTION
WHEN OTHERS THEN
write_to_aflog(p_module => 'JG.JPK.JE_PL_JPK_ACCT_BOOKS.PRINT_XML'
, p_message => 'Error in PRINT_XML '||sqlerrm);
raise;
end PRINT_XML;
我希望以编程方式提供目录,因为每次执行时目录都会更改,如下所示:
procedure PRINT_XML (p_xml xmltype
,p_requestid number)
is
l_filename varchar2(100);
doc dbms_xmldom.domdocument;
l_directory request_history.OUTPUTWORKDIRECTORY%type;
l_dml_stmnt request_history.OUTPUTWORKDIRECTORY%type;
begin
l_filename := 'JPK_Accounting_Books_'||g_jpk_ess_request_id||'.xml';
select OUTPUTWORKDIRECTORY
into l_directory
from request_history -- ESS
where requestid = p_requestid;
doc := dbms_xmldom.newdomdocument(p_xml);
dbms_xmldom.writetofile(doc, l_directory||'/'||l_filename);
dbms_xmldom.freeDocument(doc);
EXCEPTION
WHEN OTHERS THEN
write_to_aflog(p_module => 'JG.JPK.JE_PL_JPK_ACCT_BOOKS.PRINT_XML'
, p_message => 'Error in PRINT_XML '||sqlerrm);
raise;
end PRINT_XML;
然而,我得到一个错误 ORA-29280: invalid directory path
. 我试着做一个 EXECUTE IMMEDIATE CREATE OR REPLACE DIRECTORY...
但我得到了: ORA-01031: insufficient privileges
.
由于组织的政策,我无法执行以下操作:
在中添加另一个永久目录 DBA_DIRECTORIES
为当前用户提供其他权限
有没有其他方法可以在不创建命名目录的情况下使用dbms\u xmldom.writetofile(或类似的东西)?
1条答案
按热度按时间7rfyedvj1#
第一个问题可能是路径不存在,或者您对目录没有写权限。
如果没有行,则需要使用dba来解决这个问题,因为目录不存在或者您对它没有权限。数据库目录是两个元素的组合:
数据库目录是指向操作系统中某个位置的指针或引用。
该目录的路径必须存在,并且运行该进程的用户必须对其拥有读写权限。
对于第二个问题,问题是拥有该过程的用户没有被授予创建任何目录的系统权限。您的dba必须对您的用户授予createanydirectory特权,尽管我不建议这样做。授予任何特权都是不好的安全做法。
创建目录通常是dba的任务。我没有预见到需要动态创建它们的场景,只要您还必须在文件系统(linux)或windows驱动器中创建底层目录,具体取决于您的操作系统。
鉴于你的特殊情况,你别无选择。你需要重新评估解决方案。也许您可以使用writetoclob而不是writetofile,然后使用sqlplus在客户端假脱机结果