【发布时间】: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(通过
clob2file的csid=>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