使用没有命名目录的dbms\u xmldom.writetofile

pkbketx9  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(282)

我正在尝试使用以下过程使用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(或类似的东西)?

7rfyedvj

7rfyedvj1#

第一个问题可能是路径不存在,或者您对目录没有写权限。

SQL> select directory_path from all_directories where directory_name = 'YOUR DIRECTORY' ;

如果没有行,则需要使用dba来解决这个问题,因为目录不存在或者您对它没有权限。数据库目录是两个元素的组合:
数据库目录是指向操作系统中某个位置的指针或引用。
该目录的路径必须存在,并且运行该进程的用户必须对其拥有读写权限。
对于第二个问题,问题是拥有该过程的用户没有被授予创建任何目录的系统权限。您的dba必须对您的用户授予createanydirectory特权,尽管我不建议这样做。授予任何特权都是不好的安全做法。
创建目录通常是dba的任务。我没有预见到需要动态创建它们的场景,只要您还必须在文件系统(linux)或windows驱动器中创建底层目录,具体取决于您的操作系统。
鉴于你的特殊情况,你别无选择。你需要重新评估解决方案。也许您可以使用writetoclob而不是writetofile,然后使用sqlplus在客户端假脱机结果

相关问题