ORA-00932:不一致的数据类型:预期 - 得到CLOB 00932. 00000

时间:2015-02-02 16:26:50

标签: sql oracle casting subquery clob

我的列response_xml和request_xml由大字符串组成。我已经为这个大字符串使用了substring函数,以便从request_xml中获取SUBSCRIPTION_ID,从request_xml中获取orderType。查询工作正常。但是现在我想为这个查询设置条件,使它只返回SUBSCRIPTION_ID,其中orderType ='NEW'。我使用了以下查询但导致错误为ORA-00932: inconsistent datatypes: expected - got CLOB 00932. 00000 - "inconsistent datatypes: expected %s got %s"。我想我需要将列REQUEST_XML从clob转换为VARCHAR或XMLTYPE,然后对此应用子字符串。但不知道该怎么做。如果条件为iw.order_type ='NEW',则会出现错误。这是我的疑问:

select iw.order_type
    from (
       SELECT REPLACE(REPLACE(REGEXP_SUBSTR(RESPONSE_XML, '<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>\d+</ax2130:id>'), 
       '<ax2147:subscriptions xsi:type="ax2127:SubscriptionDTO"><ax2130:id>', ''), '</ax2130:id>', '') 
       AS SUBSCRIPTION_ID , 
       REPLACE(REPLACE(REGEXP_SUBSTR(REQUEST_XML, '<ns7:orderType>\d+</ns7:orderType>'), '<ns7:orderType>', ''), '</ns7:orderType>', '') 
       AS order_type,
       CREATE_DATE
       FROM
       SOAP_MONITORING 
       where WEB_SERVICE_NAME='RatorWebShopService' and WEB_METHOD_NAME='placeShopOrder' 
    ) iw
    where iw.order_type='NEW'
    order by iw.CREATE_DATE desc

1 个答案:

答案 0 :(得分:2)

列表达式作为CLOB返回;你可以将它转换为VARCHAR2:

CAST(REPLACE(REPLACE(
  REGEXP_SUBSTR(REQUEST_XML, '<ns7:orderType>\d+</ns7:orderType>'),
    '<ns7:orderType>', ''), '</ns7:orderType>', '')
  AS VARCHAR(10)) AS order_type,

您指定的大小应足够大,以满足您在该元素中所期望的最长值。但是,如果您期望一个字符串,那么正则表达式中的\d+将不正确 - 如果实际值为NEW,则将返回null。例如,您可以使用'<ns7:orderType>.+</ns7:orderType>'

如果您希望更有用,可以将subscription_id表达式包装在to_number()调用中;你已经知道这是\d+正则表达式的数值,它看起来更合适。