oracle 11g中的xmlattributes和clob问题

时间:2014-05-02 08:29:43

标签: xml oracle11g

我需要将CLOB字段用作XML属性,但需要

error ORA-00932 :inconsistent datatypes: expected-got CLOB.

使用的数据长度始终大于4k,因此我无法使用任何其他数据类型。

Column Used:
EMAIL_SUBJECT_BODY CLOB()
    XMLELEMENT("Field" ,
        XMLATTRIBUTES(
            'Email_Subject_Body' AS "name" ,
            EMAIL_SUBJECT_BODY AS "value"
    )
ERROR:   ORA-00932 :inconsistent datatypes: expected-got CLOB

它适用于:

SELECT TO_CLOB(EMAIL_SUBJECT_BODY) FROM TNAME;
SELECT XMLELEMENT("test", EMAIL_SUBJECT_BODY) FROM TNAME;

但失败了:

SELECT XMLELEMENT("test", XMLATTRIBUTES(EMAIL_SUBJECT_BODY AS "a")) FROM TNAME;

我正在使用Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production

任何线索如何解决此问题。

1 个答案:

答案 0 :(得分:0)

您不能使用长度值>带有XMLELEMENT或XMLATTRIBUTES的4000,其记录的限制。

http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions220.htm

有几个选项:

  1. 将您的数据存储为XML,这样您就不必使用Oracle API了 转换
  2. 将CLOB更改为XMLType列,然后使用 支持clob的XMLType API。
  3. 使用外部XML API(.NET,Java)。我实际上更喜欢.NET的API到Oracle的。
  4. 以老式的方式,创建带有连接的XML和一些REPLACE调用来处理转义。
  5. 我原本以为你应该能够使用PL / SQL来使用完整的VARCHAR2(32767),但我没有运气。在Google / OTN上有一个流行的例子,乍一看看起来不错,但是这个例子的问题是它使用了一个非常小的字符串。作者未能用>进行测试4K值。一旦超过4K,这也会失败:

    declare
      body  varchar2(32767);
      xml clob;
    begin
      select email_subject_body into body from email where rownum = 1;
      -- THIS FAILS TOO
      select XMLELEMENT("test", XMLATTRIBUTES(body AS "a")).GETCLOBVAL() INTO xml FROM DUAL; 
    end;
    /
    
    ERROR at line 1:
    ORA-01460: unimplemented or unreasonable conversion requested
    ORA-06512: at line 6
    

    我把它包括在这里只是为了告诉你。