Sql 从oracle存储过程导出XML文件中的所有扩展ASCII代码(字符代码128-255)
我创建了一个存储过程来生成表数据的xml文件, 但在我的数据库中,一些表有扩展的ASCII码字符码128-255 当我生成xml文件时,它显示错误ORA-31061:XDB错误:特殊字符到转义字符的转换失败 所以我将这些字符替换为空格,但我需要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
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'));