Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从oracle存储过程导出XML文件中的所有扩展ASCII代码(字符代码128-255)_Sql_Xml_Oracle_Xml Parsing_Plsqldeveloper - Fatal编程技术网

Sql 从oracle存储过程导出XML文件中的所有扩展ASCII代码(字符代码128-255)

Sql 从oracle存储过程导出XML文件中的所有扩展ASCII代码(字符代码128-255),sql,xml,oracle,xml-parsing,plsqldeveloper,Sql,Xml,Oracle,Xml Parsing,Plsqldeveloper,我创建了一个存储过程来生成表数据的xml文件, 但在我的数据库中,一些表有扩展的ASCII码字符码128-255 当我生成xml文件时,它显示错误ORA-31061:XDB错误:特殊字符到转义字符的转换失败 所以我将这些字符替换为空格,但我需要XML文件中的所有ASCII代码字符代码128-255 请帮忙 我的存储过程如下: create or replace PROCEDURE Export_project6 ( V_TABLE_NAME1 IN varchar2, v_FLAG

我创建了一个存储过程来生成表数据的xml文件, 但在我的数据库中,一些表有扩展的ASCII码字符码128-255

当我生成xml文件时,它显示错误ORA-31061:XDB错误:特殊字符到转义字符的转换失败

所以我将这些字符替换为空格,但我需要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 ;

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

dbms_xslprocessor.clob2file( result, 'MYXML', ''||V_TABLE_NAME||'.xml',1);
你通过了1分。该值表示US7ASCII:

SQL> select nls_charset_name(1) from dual;

NLS_CHAR
--------
US7ASCII
XML是UTF-8,但指定with 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',
  nls_charset_id('UTF8'));
但是,根据我们的数据库环境,将其保留为默认值可能是可以的——完全不指定csid,或者显式地将其设置为零

您提到,如果您更换了所有类似的ASCIICHAR 0-30,则可以避免ORA-31061错误♂ : 11♀ : 12♫ : 14☼ : 15► : 16◄ : 17↕ : 18 ‼ : 19 ¶ : 20. 这些符号不是您期望从ASCII中得到的,因此您的字符集、客户端或其他东西似乎对它们的解释不同

除了可打印的9、10或13之外,我得到了从0到31的所有错误。但这正是我们所期望的,这个范围内的其他角色:

U+0009、U+000A、U+000D:这些是XML 1.0中唯一接受的C0控件;
同一页显示了XML1.1中允许更多但并非所有的控制字符,但据我所知。如果你的数据中确实有控制字符,你需要去掉它们,保留制表符、新行和回车;剩下的部分在最终的XML中毫无意义,可能在现有数据中使用有限。我不确定这是否是真实数据,或者您是否生成了这些值作为测试。

您的数据库和国家字符集是什么?哪一行抛出错误?为什么要通过clob2file的csid=>1参数将输出文件类型显式设置为ASCII?不能将非ASCII字符写入仅ASCII的文件似乎是合理的?我使用了Oracle数据库,当表数据有任何类似ascii字符的字符代码128-255时,检查时间存储过程会显示类似ORA-31061的错误:XDB错误:特殊字符到转义字符的转换失败。我是否可以通过存储过程或函数处理这些类型的字符。我已将XML文件中的所有ascii字符117替换为?烧焦字符CHR14844065的示例我假设您的意思是127,而不是117。这个由于您指定的csid,输出是7位ASCII,因此看起来很好-超过127的任何内容都无法表示,所以?而是用作标记。是什么产生了ORA-31061?你现在似乎在谈论两个问题;&fnof; „ &132;"… &133;&hellip;† &134;&dagger;&8225; &135;&匕首;如果我没有更换所有ASCIICHAR 0-30之类的♂ ♀ ♫ ☼ ↕ ‼ ¶ ↓ → ← 然后执行存储过程,然后得到相同的错误显示。ORA-31061:XDB错误:特殊字符到转义字符的转换失败。@hardikrawal-XML 1.0中不允许使用大多数控制字符;我已经在我的回答中添加了这个。
dbms_xslprocessor.clob2file( result, 'MYXML', ''||V_TABLE_NAME||'.xml',871);
dbms_xslprocessor.clob2file( result, 'MYXML', ''||V_TABLE_NAME||'.xml',
  nls_charset_id('UTF8'));