Как в 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>