遇到特殊字符时,Oracle APEX的BI报告打印为空白

遇到特殊字符时,Oracle APEX的BI报告打印为空白,oracle,oracle-apex,oracle-apex-5,oracle-apex-5.1,oracle-apex-18.2,Oracle,Oracle Apex,Oracle Apex 5,Oracle Apex 5.1,Oracle Apex 18.2,我使用的是Oracle APEX 5.1版,用户正试图从Oracle APEX打印BI报告。目前,我们正在使用“APEX_UTIL.DOWNLOAD_PRINT_DOCUMENT”(签名4)将APEX页面中的数据打印到BI报告中 APEX_UTIL.DOWNLOAD_PRINT_DOCUMENT (p_file_name => 'myreport',p_content_disposition => 'attachment', p_report_data => l_clob, /

我使用的是Oracle APEX 5.1版,用户正试图从Oracle APEX打印BI报告。目前,我们正在使用“APEX_UTIL.DOWNLOAD_PRINT_DOCUMENT”(签名4)将APEX页面中的数据打印到BI报告中

APEX_UTIL.DOWNLOAD_PRINT_DOCUMENT (p_file_name => 'myreport',p_content_disposition => 'attachment', p_report_data => l_clob, /* XML data in clob format */ p_report_layout => l_file_as_clob,p_report_layout_type => 'rtf',
  p_document_format => 'rtf');
在程序遇到XML标记中的“&”或“”之前,一切正常。当“XML BI报告”或“APEX_UTIL.DOWNLOAD_PRINT_DOCUMENT”(我提到这两个字符是因为我不知道问题发生在哪里)遇到这些字符时,报告显示为空白。如果手动从XML标记中删除上述字符,BI报告将正常工作并打印出来

复制步骤: 1) 按照下面的示例创建XML数据。请参阅“gmriskmediation”XML标记中的“&”(您可以将此“&”替换为“”,您将得到相同的结果)


3) 现在,如果您按下按钮,BI报告将成功下载,但它将为空。

最后,我能够解决此问题。我能够解决字符问题,我所做的只是将“&”替换为“%26”,一切正常,现在我也不必从本机字符集转换字符,这也提高了性能

l_clob := replace(l_clob,'&','%26');
请在下面找到URL以供进一步参考


您可以使用APEX\u UTIL.URL\u ENCODE将“&”转换为“%26”

申报

    l_clob      CLOB;
    l_varchar   VARCHAR2(32767);
    l_start     PLS_INTEGER := 1;
    l_buffer    PLS_INTEGER := 32767;   
开始


结束

只是一个建议,我不知道是否能解决你的问题。。。。如果可以,请尝试转义每个xml元素的内容。不要转义所有xml,只转义每个标记的内容[当我第一次实现解决方案时,生成的xml具有等效的字符实体,例如xml数据具有“&;”,引号在xml中表示为
。]“测试。测试及测试;testQuotes工作正常,即使XML在内容中有引号符号,它也适用于撇号'但当我用实际的撇号符号替换它时,它起了作用。我所观察到的是,当它遇到“&“它可以是”或者它无法翻译回它的符号时,我认为这是oracle APEX的问题
    l_clob      CLOB;
    l_varchar   VARCHAR2(32767);
    l_start     PLS_INTEGER := 1;
    l_buffer    PLS_INTEGER := 32767;   
    DBMS_LOB.CREATETEMPORARY(l_clob, TRUE);
    FOR i IN 1..CEIL(DBMS_LOB.GETLENGTH(l_xml_clob) / l_buffer) LOOP
        l_varchar := DBMS_LOB.SUBSTR(l_xml_clob, l_buffer, l_start);
        l_varchar := APEX_UTIL.URL_ENCODE(l_varchar);    
        DBMS_LOB.WRITEAPPEND(l_clob, LENGTH(l_varchar), l_varchar);
        l_start := l_start + l_buffer;
    END LOOP;