ORA-00932: несовместимые типы данных: ожидалось — получено CLOB 00932. 00000

У меня есть столбцы response_xml и request_xml, которые состоят из большой строки. Я использовал функцию подстроки для этой большой строки, чтобы получить SUBSCRIPTION_ID из response_xml и orderType из request_xml. Запрос работает нормально. Но теперь я хочу поставить условие для этого запроса, чтобы он возвращал только 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

person Community    schedule 02.02.2015    source источник


Ответы (1)


Выражение столбца возвращается как 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+ в этом регулярном выражении не будет правильным - если фактическое значение НОВОЕ, вы получите обратно нуль. Например, вы можете использовать '<ns7:orderType>.+</ns7:orderType>'.

Вы также можете обернуть выражение subscription_id вызовом to_number(), если хотите, чтобы это было более удобно; вы уже знаете, что это числовое значение из регулярного выражения \d+, где оно кажется более подходящим.

person Alex Poole    schedule 02.02.2015
comment
Спасибо, Алекс, все работает. Просто небольшой вопрос. SUBSCRIPTION_ID содержит только цифры, поэтому могу ли я преобразовать его в число вместо varchar для RESPONSE_XML? - person ; 02.02.2015
comment
@Ajay - да, я уже отредактировал, чтобы сказать, что вы можете использовать для этого to_number(). - person Alex Poole; 02.02.2015
comment
to_number(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›', '')) SUBSCRIPTION_ID Правильно ли я написал, чтобы преобразовать его в число? и я изменил '‹ns7:orderType›.+‹/ns7:orderType›' - person ; 02.02.2015
comment
Спасибо Алекс :) ​​Я попытаюсь изменить свой запрос - person ; 02.02.2015