Базы данных Oracle - статьи

         

Прием сообщений XML в Oracle


Возможность обмена сообщениями в формате XML подразумевает для СУБД Oracle возможность приема таких сообщений с узлов web и возможность их публикации на узлах. Сначала рассмотрим первую возможность. Для этого составим файл mydoc.xml и поместим его в каталог htdocs:

<cover>

<title>Oracle SQL*Loader</title>

<author>Jonathan Gennick</author>

<author>Sanjay Mishra</author>

<pages>269</pages>

</cover>

Наберем в браузере адрес http://localhost:7778/mydoc.xml (здесь и далее - для версии 9; в версии 8.1 http://localhost/mydoc.xml). В окошке должен появиться текст "опубликованного в web" документа.

Для прочтения СУБД XML сообщений в Oracle есть разные способы. Рассмотрим способ совсем простой: с использованием встроенного пакета UTL_HTTP. В составе этого пакета есть процедуры, позволяющие читать заголовок HTTP ответа с web узла и текст сообщения. Вот пример их использования в SQL*Plus:

SET SERVEROUTPUT ON SIZE 40000

DECLARE req utl_http.req; resp utl_http.resp; name VARCHAR2(256); value VARCHAR2(1024);

BEGIN req := utl_http.begin_request
('http://localhost:7778/mydoc.xml'); resp := utl_http.get_response(req);

dbms_output.put_line('HTTP response status code:
' resp.status_code); dbms_output.put_line('HTTP response reason: '
resp.reason_phrase);

dbms_output.put_line('-----');

FOR i IN 1 .. utl_http.get_header_count(resp) LOOP utl_http.get_header(resp, i, name, value); dbms_output.put_line(name ': ' value); END LOOP;

dbms_output.put_line('-----');



LOOP utl_http.read_line(resp, value, TRUE); dbms_output.put_line(value); END LOOP;

EXCEPTION WHEN utl_http.end_of_body THEN
utl_http.end_response(resp); END; /

Результат будет примерно такой:

HTTP response status code: 200 HTTP response reason: OK -- Date: Fri, 28 May 2004 13:01:49 GMT Server: Oracle HTTP Server Powered by Apache/1.3.22

(Win32) mod_plsql/3.0.9.8.3b PHP/4.3.0 mod_ssl/2.8.5

OpenSSL/0.9.6b mod_fastcgi/2.2.12 mod_oprocmgr/1.0 mod_perl/1.25 Last-Modified: Thu, 13 May 2004 15:15:47 GMT ETag: "0-98-40a39123" Accept-Ranges: bytes Content-Length: 152 Connection: close Content-Type: text/xml -- <cover>


<title>Oracle SQL*Loader</title>

<author>Jonathan Gennick</author>

<author>Sanjay Mishra</author>

<pages>269</pages>

</cover>

Процедура PL/SQL успешно завершена.

SQL> ...

Построить процедуру получения XML документа на основе текста выше - дело техники. Разумно включить в процедуру проверку поля Content-Type ответа HTTP. Получится примерно следующее:

DECLARE xmldoc VARCHAR2(4000) := ''; ok BOOLEAN := FALSE;

PROCEDURE readxml(url IN VARCHAR2,
doc OUT VARCHAR2, success OUT BOOLEAN) IS req utl_http.req; resp utl_http.resp; name VARCHAR2(256); value VARCHAR2(1024);

BEGIN doc := ''; req := utl_http.begin_request(url); resp := utl_http.get_response(req);

success := resp.status_code = 200; IF success THEN FOR i IN 1 .. utl_http.get_header_count(resp) LOOP utl_http.get_header(resp, i, name, value); success := name = 'Content-Type' AND
value = 'text/xml'; EXIT WHEN success; END LOOP;

IF success THEN LOOP utl_http.read_line(resp, value, TRUE); doc := doc value; END LOOP; END IF; END IF;

EXCEPTION WHEN utl_http.end_of_body THEN
utl_http.end_response(resp); END;

BEGIN readxml('http://localhost:7778/mydoc.xml',
xmldoc, ok); IF ok THEN dbms_output.put_line(xmldoc); ELSE dbms_output.put_line('Not XML
or bad URL'); END IF; END; /

Более практично использовать для считываемого документа тип CLOB, а не VARCHAR2. Но это бы усложнило пример, а к сути не относится, и поэтому здесь не рассматривается. Так же ради простоты не рассматриваются технические вопросы форматирования текста документа.

Полученный таким образом текст XML документа можно помещать в БД или подвергать обработке.

То же самое можно в Oracle делать не только в PL/SQL, но и на Java.


Содержание раздела