【问题标题】:Exporting xmltype columns to file with diacritical marks in it将 xmltype 列导出到其中带有变音符号的文件
【发布时间】:2013-09-30 11:14:50
【问题描述】:

我正在 PL/SQL 中构建导出以导出有关客户的数据。 xml 建立在一个临时表中,直到那时一切似乎都可以工作。

但是,当将 xmltype 列写入文件时,我遇到了麻烦。

例如,当我有一个像“Böhomer”这样的名称并将其导出到文件时,我看到发生了一些事情:

当我用 Textpad 打开它时,一切似乎都很好,我看到了 ö 字母

当我用像 Oxygen 这样的 XML 编辑器打开它时,我看到了 Bhomer

当我用 Java 阅读它时,我看到了 B�hmer

我假设文件应该可以通过所有这三种方法正确读取,并怀疑我对文件的编码做错了(尽管文件中存在正确的数据,因为我可以用 textpad 看到它,我想我当我发送这种 XML 时会引起客户抱怨)

问题是,我不知道如何正确处理,甚至不知道正确的编码是什么。文件的写入由 UTL_FILE 完成。

需要注意的是,当我使用 textpad 打开文件并在明确选择 UTF-8 编码的同时将其保存时,氧气 XML 编辑器和 java.xml 可以读取它。我尝试使用 UTL_FILE.FOPEN_NCHAR 过程将我的 PL/SQL 代码保存为 UTF-8,但这只会给我类似 ORA-29298: Character set mismatch 之类的错误。

有什么办法可以解决这个问题吗?

我的数据库字符集是 WE8MSWIN1252

正在使用的版本: Oracle Database 11g 企业版 11.2.0.2.0 - 64 位生产 PL/SQL 版本 11.2.0.2.0 - 生产 核心 11.2.0.2.0 生产 适用于 64 位 Windows 的 TNS:版本 11.2.0.2.0 - 生产 NLSRTL 版本 11.2.0.2.0 - 生产

【问题讨论】:

    标签: xml oracle plsql


    【解决方案1】:

    我想我可以回答我自己的问题。

    我用以下代码重现了我的问题:

    DECLARE
       outputxml   XMLTYPE;
    
       fileName    VARCHAR2 (100) := 'testfile.xml';
       dir         VARCHAR2 (100) := 'XML_OUTPUT_DIR';
       fHandler    UTL_FILE.FILE_TYPE;
       xmlclob     CLOB;
    BEGIN
       --Create some XML
       SELECT   XMLELEMENT ("name", 'Böhmer') INTO outputxml FROM DUAL;
    
       --Transform it into a clob
       xmlclob := outputxml.getclobval ();
    
       --Open a file and write the clob and close it
       fHandler := UTL_FILE.FOPEN (dir, fileName, 'W');
       UTL_FILE.PUT (fHandler, xmlclob);
       UTL_FILE.FCLOSE (fHandler);
    END;
    

    通过将 FOPEN 和 PUT 函数(而不是像我之前所做的那样仅 FOPEN 函数)更改为 NCHAR 版本,我得到了一个 Oxygen XML 编辑器和 Java 都可以读取的文件。

    带有 NCHAR 函数的示例程序:

    DECLARE
       outputxml   XMLTYPE;
    
       fileName    VARCHAR2 (100) := 'testfile.xml';
       dir         VARCHAR2 (100) := 'XML_OUTPUT_DIR';
       fHandler    UTL_FILE.FILE_TYPE;
       xmlclob     CLOB;
    BEGIN
       --Create some XML
       SELECT   XMLELEMENT ("name", 'Böhmer') INTO outputxml FROM DUAL;
    
       --Transform it into a clob
       xmlclob := outputxml.getclobval ();
    
       --Open a file and write the clob and close it
       fHandler := UTL_FILE.FOPEN_NCHAR (dir, fileName, 'W');
       UTL_FILE.PUT_NCHAR (fHandler, xmlclob);
       UTL_FILE.FCLOSE (fHandler);
    END;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-17
      • 1970-01-01
      • 2011-03-03
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多