将xmltype列导出到文件中,并带有变音标记

时间:2013-09-30 11:14:50

标签: xml oracle plsql

我正在用PL / SQL中的导出来导出有关客户的数据。 xml在临时表中构建,直到那一切似乎工作文件。

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

例如,当我有一个像'Böhomer'这样的名字,然后我把它导出到一个文件时,我发现了一些事情:

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

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

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

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

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

有趣的是,当我使用textpad打开文件并在显式选择UTF-8编码时保存它时,氧气XML编辑器和java会变得可读。我尝试使用UTL_FILE.FOPEN_NCHAR程序将我的PL / SQL代码保存为UTF-8,但这只给了我像ORA-29298这样的错误:字符集不匹配。

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

我的数据库字符集是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 - 生产

1 个答案:

答案 0 :(得分:2)

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

我用以下代码复制了我的问题:

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;

通过将NOPAR版本的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;