【问题标题】:Export all The extended ASCII codes (character code 128-255) in XML file from oracle store procedure从 oracle 存储过程中导出 XML 文件中的所有扩展 ASCII 代码(字符代码 128-255)
【发布时间】:2014-06-17 17:41:13
【问题描述】:

我创建了一个存储过程来生成一个表数据的 xml 文件, 但在我的数据库中,一些表有"extended ASCII codes (character code 128-255)"

当我生成 xml 文件时,它会显示错误 "ORA-31061: XDB error: special char to escaped char conversion failed."

所以我将这些 Char 替换为空格,但 我需要 XML 文件中的所有 ASCII 代码(字符代码 128-255)。

请帮忙

我的店铺流程如下:

create or replace
PROCEDURE Export_project6
(
   V_TABLE_NAME1 IN varchar2,
   v_FLAG OUT NUMBER
  )
AS
BEGIN
         ----- Export  table data
     DECLARE
        v_file  UTL_FILE.file_type;
        qryCtx DBMS_XMLGEN.ctxHandle;
        result CLOB;
        v_FILENAME varchar2(50);
        V_TABLE_NAME varchar2(50);
        xt_data xmltype;
        v_ctx dbms_xmlgen.ctxHandle;
        rc_data sys_refcursor;



      BEGIN
         V_TABLE_NAME := UPPER(V_TABLE_NAME1) ;      
         v_file := UTL_FILE.fopen('MYXML',V_TABLE_NAME||'.xml', 'W');
            OPEN rc_data FOR
                 'select * FROM '||V_TABLE_NAME||' ORDER BY 1' ;
                  v_ctx := dbms_xmlgen.newContext (rc_data);
                  DBMS_XMLGEN.USEITEMTAGSFORCOLL (v_ctx);
                  DBMS_XMLGEN.SETNULLHANDLING(v_ctx, 1);
                  DBMS_XMLGEN.setrowsettag(v_ctx,'root');
                  DBMS_XMLGEN.setrowtag(v_ctx,V_TABLE_NAME );
          result:=  DBMS_XMLGEN.getXML(v_ctx);
          result := REPLACE( result, '<?xml version="1.0"?>','<?xml version="1.0" encoding="UTF-8" standalone ="yes"?>');
          -- DBMS_XMLGEN.RESTARTQUERY (v_ctx);  
          -- xt_data := dbms_xmlgen.getXMLType (v_ctx);

          dbms_xslprocessor.clob2file( result, 'MYXML', ''||V_TABLE_NAME||'.xml',1);
          dbms_xmlgen.closeContext (v_ctx);
          v_FLAG := 1;

      EXCEPTION
      WHEN OTHERS THEN
          DBMS_OUTPUT.PUT_LINE(SQLERRM);
          DBMS_XMLGEN.closeContext (v_ctx);
          v_FLAG := 0;
      END ;

请在此处提供建议和帮助

END Export_project6;

【问题讨论】:

  • 您的数据库和国家字符集是什么?哪一行会引发错误?为什么将输出文件类型显式设置为 ASCII(通过 clob2filecsid=&gt;1 参数)- 不能将非 ASCII 字符写入纯 ASCII 文件似乎是合理的?
  • 我使用了 Oracle 数据库,当表数据有任何类似 ascii 字符(字符代码 128-255)时检查 ascii-code.com/,that 时间存储过程显示类似“ORA-31061:XDB 错误:要转义的特殊字符”的错误字符转换失败。”,我不能通过存储过程或函数处理这些类型的字符吗?
  • 我已经从空间中替换了所有 ascii char 117 的输出替换为 ?字符。 char chr(14844065) 示例
  • 我假设您的意思是 127,而不是 117。? 似乎很好,因为由于您指定的 csid,输出是 7 位 ASCII - 超过 127 的任何内容都无法表示, 所以 ? 被用作标记。然而,是什么产生了 ORA-31061 - 你现在似乎在这里谈论两个问题?
  • ƒ ƒ ƒ „ „ &bdqu; … … … † † &匕首; ‡ ‡ &匕首;

标签: sql xml oracle xml-parsing plsqldeveloper


【解决方案1】:

至少部分问题在于您指定的文件应该是 US7ASCII,它只允许前 128 个 ASCII 字符,而不是 128-255 的扩展值。您在这一行中这样做:

dbms_xslprocessor.clob2file( result, 'MYXML', ''||V_TABLE_NAME||'.xml',1);

您将1 传递为the fourth parameter, csid。该值代表 US7ASCII:

SQL> select nls_charset_name(1) from dual;

NLS_CHAR
--------
US7ASCII

您的 XML 是 UTF-8,但使用 encoding="UTF-8" 指定与文件的写入方式无关。任何无法识别的字符都将替换为?。因此,您可能希望对文件使用相同的设置:

SQL> select nls_charset_id('UTF8') from dual;

NLS_CHARSET_ID('UTF8')
----------------------
                   871

所以:

dbms_xslprocessor.clob2file( result, 'MYXML', ''||V_TABLE_NAME||'.xml',871);

或者说得更清楚:

dbms_xslprocessor.clob2file( result, 'MYXML', ''||V_TABLE_NAME||'.xml',
  nls_charset_id('UTF8'));

但将其保留为默认值可能没问题 - 根本不指定 csid,或明确将其设置为零 - 取决于我们的数据库环境。

您提到,如果您“替换所有 ASCIICHAR (0-30),如 ♂ : 11 ♀ : 12 ♫ : 14 ☼ : 15 ► : 16 ◄ : 17 ↕ : 18 ‼ : 19 ¶ : 20 ”。这些符号不是您对 ASCII 的期望,因此您的字符集或客户端或其他东西似乎对它们的解释不同。

我得到了所有 ASCII control characters 的错误,从 0 到 31,除了可打印的:9、10 或 13。但这是预期的,该范围内的其他字符 are not valid in XML 1.0

  • U+0009、U+000A、U+000D:这些是 XML 1.0 中唯一接受的 C0 控件;

同一页面显示 XML 1.1 中允许使用更多但不是全部的控制字符,但据我所知Oracle only supports 1.0。如果您的数据中确实有控制字符,则需要去除它们(保留制表符、新行和回车);无论如何,其余的在最终的 XML 中将毫无意义,并且可能在您现有的数据中使用有限。我不确定这是否是真实数据,或者您是否生成了这些值作为测试。

【讨论】:

  • 如果我没有像 ♂ ♀ ♫ ☼ ↕ ‼ ¶ ↓ → ← 那样替换所有 ASCIICHAR (0-30) 然后执行存储过程然后得到相同的错误显示。 “ORA-31061:XDB 错误:特殊字符到转义字符的转换失败。”
  • @hardikrawal - XML 1.0 中不允许使用大多数控制字符;我已将其添加到我的答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 2019-08-19
  • 2016-06-23
  • 2011-04-14
相关资源
最近更新 更多