2015-05-13 3 views
2

У меня есть следующее значение XML, который хранится в столбце request_xml и который CLOB тип данных:Извлечение данных из значения XML данных типа CLOB

<?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
    <ns:updateRechargeTicketResponse xmlns:ns="http://service.soap.CDRator.com"> 
     <ns:return xmlns:ax232="http://core.result.service.soap.CDRator.com/xsd" xmlns:ax233="http://core.data.soap.CDRator.com/xsd" xmlns:ax230="http://payment.result.service.soap.CDRator.com/xsd" xmlns:ax228="http://data.soap.CDRator.com/xsd" xmlns:ax231="http://result.service.soap.CDRator.com/xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ax230:RechargeTicketResultDTO"> 
     <ax233:id xsi:nil="true"/> 
     <ax232:code>0</ax232:code> 
     <ax232:description>SOAP_GLOBAL_SUCCESS</ax232:description> 
     <ax232:serviceUser xsi:nil="true"/> 
     <ax232:success>true</ax232:success> 
     <ax232:translationTag>SOAP_GLOBAL_SUCCESS</ax232:translationTag> 
     <ax230:rechargeTicket xsi:type="ax228:RechargeTicketDTO"> 
      <ax233:id>201505131421267777</ax233:id> 
      <ax233:billingGroupId>201505071857272816</ax233:billingGroupId> 
      <ax233:code>BALANCE_DIRECTDEBIT</ax233:code> 
      <ax233:dateCreated>2015-05-13</ax233:dateCreated> 
      <ax233:dayOfMonth>0</ax233:dayOfMonth> 
      <ax233:nextRechargeDate xsi:nil="true"/> 
      <ax233:rechargeAmount>10.0</ax233:rechargeAmount> 
     </ax230:rechargeTicket> 
     </ns:return> 
    </ns:updateRechargeTicketResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

Я хочу, чтобы извлечь значение из. Я использовал ниже запрос, но он возвращает nothing.I я получаю сообщение об ошибке, как

ORA-19228: XPST0008 - undeclared identifier: prefix 'ax230' local-name 'ax230:rechargeTicket' 
19228. 00000 - "XPST0008 - undeclared identifier: prefix '%s' local-name '%s'" 

Вот мой запрос

SELECT ID,CREATE_DATE,WEB_SERVICE_NAME,WEB_METHOD_NAME,xt_billingGroupId.BILLING_GROUP_ID,xt_error_code.ERROR_CODE,xt_error_message.ERROR_DESCRIPTION,xt_code.CODE,xt_rec_id.RECHARGE_TICKET_ID 
FROM TEMP_SOAP_MONITORING_TOPUP sm 
CROSS JOIN XMLTable(XMLNAMESPACES (
     'http://schemas.xmlsoap.org/soap/envelope/' AS "soapenv", 
     'http://service.soap.CDRator.com' as "ns", 
     'http://core.data.soap.CDRator.com/xsd' as "ax2130", 
     'http://webshop.result.service.soap.CDRator.com/xsd' as "ax2147", 
     'http://core.signup.data.soap.CDRator.com/xsd' as "ns3", 
     'http://service.soap.CDRator.com' as "ns5",  
     'http://core.data.soap.CDRator.com/xsd' as "ax233", 
     'http://core.result.service.soap.CDRator.com/xsd' as "ax232" 
    ), 
    'for $i in //*:billingGroupId return $i' 
    passing XMLType(sm.REQUEST_XML) 
    columns "BILLING_GROUP_ID" VARCHAR2(100) path '/') xt_billingGroupId  
CROSS JOIN XMLTable(XMLNAMESPACES (
     'http://core.result.service.soap.CDRator.com/xsd' as "ax232" 
    ), 
    'for $i in //ax232:code return $i' 
    passing XMLType(sm.RESPONSE_XML) 
    columns "ERROR_CODE" VARCHAR2(100) path '/') xt_error_code 
CROSS JOIN XMLTable(XMLNAMESPACES (
     'http://core.result.service.soap.CDRator.com/xsd' as "ax232" 
    ), 
    'for $i in //ax232:description return $i' 
    passing XMLType(sm.RESPONSE_XML) 
    columns "ERROR_DESCRIPTION" VARCHAR2(200) path '/') xt_error_message 
CROSS JOIN XMLTable(XMLNAMESPACES (
     'http://core.result.service.soap.CDRator.com/xsd' as "ax232" 
    ), 
    'for $i in //*:code return $i' 
    passing XMLType(sm.REQUEST_XML) 
    columns "CODE" VARCHAR2(100) path '/') xt_code 
CROSS JOIN XMLTable(XMLNAMESPACES (
     'http://core.data.soap.CDRator.com/xsd' as "ax233" 
    ), 
    'for $i in //ax230:rechargeTicket return $i' 
    passing XMLType(sm.RESPONSE_XML) 
    columns "RECHARGE_TICKET_ID" VARCHAR2(200) path 'ax233:id') xt_rec_id 

ответ

2

Ваши Пространства имен не совпадают на исходном XML и ваш запрос

'http://data.soap.CDRator.com/xsd' as "ax233" 

против

xmlns:ax233="http://core.data.soap.CDRator.com/xsd" 

Попробуйте удалить core. из вашего источника или добавьте core. к вашему XMLNAMESPACES за ax233.


Чтобы исправить ошибку:

ORA-19228: XPST0008 - undeclared identifier: prefix 'ax230' local-name 'ax230:rechargeTicket' 
19228. 00000 - "XPST0008 - undeclared identifier: prefix '%s' local-name '%s'" 

вам не хватает объявление пространства имен для ax230 так XMLNAMESPACES вам нужно добавить:

'http://payment.result.service.soap.CDRator.com/xsd' as "ax230", 

Вы также можете найти его проще если запрос отформатирован лучше (если у вас нет причин, по которым вы делаете это так, как вы). Для образца, смотрите ниже:

SELECT 
    t.error_code 
, t.error_description 
, t.code 
FROM temp_soap_monitoring_topup sm 
, XMLTABLE(
    XMLNAMESPACES (
     'http://schemas.xmlsoap.org/soap/envelope/' AS "soapenv", 
     'http://service.soap.CDRator.com' as "ns", 
     'http://core.data.soap.CDRator.com/xsd' as "ax2130", 
     'http://webshop.result.service.soap.CDRator.com/xsd' as "ax2147", 
     'http://core.signup.data.soap.CDRator.com/xsd' as "ns3", 
     'http://service.soap.CDRator.com' as "ns5", 
     'http://payment.result.service.soap.CDRator.com/xsd' as "ax230",  
     'http://core.data.soap.CDRator.com/xsd' as "ax233", 
     'http://core.result.service.soap.CDRator.com/xsd' as "ax232" 
    ) 
    , 'soapenv:Envelope/soapenv:Body/ns:updateRechargeTicketResponse/ns:return' 
    PASSING XMLTYPE(sm.response_xml) 
    COLUMNS 
    error_code  VARCHAR2(100) PATH 'ax232:code/text()' 
    , error_description VARCHAR2(100) PATH 'ax232:description/text()' 
    , code    VARCHAR2(100) PATH 'ax230:rechargeTicket/ax233:code/text()' 
) t 
+0

Я пытался, но он не работает :( – Andrew

+1

Я положил свой XML в таблице в моей локальной БД, заменить ' 'http://data.soap.CDRator.com/xsd 'as "ax233", 'with'' http://core.data.soap.CDRator.com/xsd 'как "ax233", 'и я получаю ID обратно –

+1

Здравствуйте, я отредактировал мой вопрос, который он работает отлично, когда я тестировал его только с этим условием, но теперь я перечислил свой полный запрос, и он дает ошибку. Не могли бы вы рассказать мне, почему он дает ошибку? Пожалуйста, просто взгляните на мое последнее кросс-соединение в запросе, где у меня есть error – Andrew

Смежные вопросы