Как в PL/SQL процедуре преобразовать в xmlType только часть CLOB содержащую XML?

В CLOВ хранится запрос в XML формате вместе с преамбулой:

POST:...
Cache-Control: no-cache
Connection: keep-alive
...
SOAPAction: ...


<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header>
  </SOAP-ENV:Header>
  <SOAP-ENV:Body>
   ... 
   *тело SOAP-запроса*
   ...
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Пытаюсь написать PL/SQL процедуру, в которой обрабатываю CLOB, но xmlТype() с этими данными дает след. ошибку:

ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00210: expected '<' instead of 'P'
Error at line 1
ORA-06512: at "SYS.XMLTYPE", line 272
ORA-06512: at line 1

Ответы (1 шт):

Автор решения: 0xdb

Попробуйте так:

var rc refcursor 
declare 
    result varchar2 (32000); 
    clobval clob := '
POST:...
Cache-Control: no-cache
Connection: keep-alive
...
SOAPAction: ...

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header>
  </SOAP-ENV:Header>
  <SOAP-ENV:Body>
   ... 
   *тело SOAP-запроса*
   ...
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>'; 
begin
    result := xmlType (regexp_substr (
    dbms_lob.substr (clobval, 32000), '<SOAP-ENV:Envelope.*</SOAP-ENV:Envelope>', 1, 1, 'n')
    ).getStringVal ();
    
    open :rc for select result result from dual;  
end;
/

Результат:

RESULT
---------------------------------------------------------------------------------
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header>
  </SOAP-ENV:Header>
  <SOAP-ENV:Body>
   ... 
   *тело SOAP-запроса*
   ...
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
→ Ссылка