如何使用US7ASCII将包含中文字符和UTF-8编码的XML文件导入Oracle数据库

我一直在努力将包含汉字并以UTF-8编码的XML文件从外部各方导入到我们的使用US7ASCII编码的Oracle数据库中。但是,以下错误不断提示:

pkg_dxe.get_xmldata: ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00200: could not convert from encoding UTF-8 to US-ASCII
Error at line 1

处理导入过程的PL \ SQL代码:

v_xml := XMLType(bfilename('XMLDIR_IBISAPP', 'xmldata.xml'), nls_charset_id('UTF8'));
Select count(*) into v_cnt from XML_TAB_A;
If v_cnt > 0 then    
    update XML_TAB_A set 
        xml_data = v_xml, 
        timestamp = sysdate;
else
    Insert into XML_TAB_A(xml_data, timestamp) values (v_xml, sysdate);
end if;

XML示例:

<?xml version="1.0" standalone="yes" ?> 
<APPLICATION>
  <DXE_APPLICATION>
    <APP_TRAN_NO>20180621031622817</APP_TRAN_NO> 
  </DXE_APPLICATION>
  <DXE_CUSTOMER>
    <APP_TRAN_NO>20180621031622817</APP_TRAN_NO> 
    <SEQ>0</SEQ>  
    <CUST_TITLE>Mr.</CUST_TITLE> 
    <CUST_NAME>HELLO</CUST_NAME> 
    <CUST_GNAME>HELLO</CUST_GNAME> 
    <CUST_ONAME>hello</CUST_ONAME> 
    <CUST_NAME_CHN>陳大文</CUST_NAME_CHN>
  </DXE_CUSTOMER>
</APPLICATION>

导致该错误的字段是Cust_Name_Chn,但是我们不能排除在其他字段中还会提供汉字的问题。

当包含中文字符时,有什么方法可以正确地将XML导入我们的Oracle数据库而不会提示错误?如果在此阶段导入后无法读取汉字,则可以接受。

我尝试使用CONVERT()函数,但错误LPX-00200仍然存在。

温弗里德(Wernfried Domscheit)

您应该考虑将数据库迁移到UTF-8,请参见“字符集迁移”将数据库从迁移US7ASCIIAL32UTF8不会造成任何麻烦。

Oracle XML DB限制说:

不支持NCHAR,NVARCHAR2和NCLOB – Oracle XML DB不支持将SQL数据类型NCHAR,NVARCHAR2和NCLOB用于以下任何一种:

  • 在XML模式中使用SQLType注释将XML元素或属性映射到这些数据类型

  • 使用SQL / XML函数XMLElement,XMLAttributes和XMLForest从这些数据类型生成XML数据

  • 在SQL / XML函数XMLQuery和XMLTable中,对包含具有这些数据类型的列的表使用XQuery函数ora:view(不建议使用),fn:doc和fn:collection

为了处理,存储或生成包含多字节字符的XML数据,Oracle强烈建议您使用AL32UTF8作为数据库字符集。

您可以将纯数据存储为NCLOB

CREATE TABLE XML_TAB_A (xml_data NCLOB, ts TIMESTAMP);

DECLARE

    v_nclob NCLOB;
    v_cnt NUMBER;

    xbfile   BFILE; 
    destOffset INTEGER := 1; 
    srcOffset INTEGER := 1; 
    langContext INTEGER := DBMS_LOB.DEFAULT_LANG_CTX; 
    warning INTEGER; 

BEGIN

    xbfile := BFILENAME ('XMLDIR_IBISAPP', 'xmldata.xml'); 
    DBMS_LOB.OPEN (xbfile); 
    DBMS_LOB.CREATETEMPORARY (v_nclob, TRUE, DBMS_LOB.SESSION); 
    DBMS_LOB.LOADCLOBFROMFILE (
        dest_lob => v_nclob, 
        src_bfile => xbfile, 
        amount => DBMS_LOB.GETLENGTH(xbfile), 
        dest_offset => destOffset, 
        src_offset => srcOffset, 
        bfile_csid => NLS_CHARSET_ID('AL32UTF8'), 
        lang_context => langContext, 
        warning => warning);    
    DBMS_LOB.CLOSE (xbfile); 

    SELECT COUNT(*) INTO v_cnt FROM XML_TAB_A;
    IF v_cnt > 0 THEN    
         UPDATE XML_TAB_A SET 
              xml_data = v_nclob, 
              ts = SYSDATE;
    ELSE
         INSERT INTO XML_TAB_A(xml_data, ts) VALUES (v_nclob, SYSDATE);
    END IF;

END;

但是,您将不能使用任何XMLTYPE函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Blob对象将较大的原始XML文件写入Oracle数据库?

如何在Oracle SQL Developer工具中运行.sql文件以导入数据库?

无法将中文字符写入文件名

Oracle数据库中的波斯字符编码

如何使用robotframework数据库库将utf8字符插入oracle数据库

如何将bak文件导入Azure数据库

使用WAMP将sql文件导入数据库

Android Studio-数据库文件加载的编码错误:“ UTF-8”

使用MySQL数据库进行UTF 8编码

从CSV文件导入数据库,utf8问题

删除大文本文件中除ASCII可打印和中文字符以外的所有字符

将XML文件导入具有定义ID的Access数据库

如何将转储文件Oracle数据库导入MySQL

如何使用PHP从数据库编码UTF8

使用php将txt文件导入mysql数据库

如何从包含多个数据库的.sql文件导入单个数据库

将XML导入Sql数据库

将XML导入MySQL数据库

将XML文件导入PostgreSQL数据库

将数据从Oracle导入Microsoft SQL数据库

如何将 .json 文件导入 Firebase 数据库?

使用 Python 将 Oracle 数据库表导出为 XML 文件?

使用 XSLT 将 XML 导入文件格式化到数据库

如何将JSON文件导入数据库

在 Linux 上使用中文字符进行 XML UTF-8/ISO-8859-1 编码的问题

如何从大型sql文件中导入数据库Oracle

寻找使用 Laravel 处理大型 XML 文件以将部分导入 MySQL 数据库的更好方法

如何将 JSON 文件导入 postgresql 数据库?

如何将 CSV 文件导入 PostgresSQL 数据库?