В версии Oracle 9.2 появилась еще одна возможность опубликования в web документов в формате XML на основе данных их БД. Хотя технически она основывается на использовании сервлета так, как это было описано только что, она не требует от потребителя знания Java, но зато может потребовать более досконального знания технологий XML. Эта возможность носит название XSQL.
В каталогах ПО Oracle в результате типовой установки образуется каталог c:\oracle\ora92\xdk\demo\java\xsql. Создадим там свой рабочий каталог myxsql. Заведем файл с именем emps.xsql:
<?xml version="1.0"?>
<page connection="demo" xmlns:xsql="urn:oracle-xsql">
<xsql:include-request-params/>
<xsql:query tab="EMP" null-indicator="yes" >
SELECT * FROM {@tab}
</xsql:query>
</page>
Обратимся из браузера по адресу http://localhost:7778/xsql/myxsql/emps.xsql?tab=emp. Данные из Oracle опубликованы в web.
Упражнение. Замените в адресе tab=emp на tab=dept, потом на tab=bonus; наблюдайте результат. Уберите из адреса параметр запроса (знак вопроса и все, что справа от него). Наблюдайте результат.
Может возникнуть вопрос: как Oracle распознает, что запрашивать следует таблицы в схеме SCOTT, если мы нигде этого не указали ? На самом деле указали. Обратите внимание на фрагмент connection="demo" в тексте выше. Ссылка на БД и схему спрятана под именем demo. Обратитесь к файлу XSQLConfig.xml в каталоге с:\oracle\ora92\xdk\admin и найдите определение этой ссылки. Это будет БД ORCL и схема SCOTT. При желании эту ссылку можете переопределить, или добавить собственную.
Сервлет, который фактически обрабатывает запросы формата XSQL, интересен тем, что умеет обрабатывать поля типов XMLTYPE и объектов, а также типа коллекции, в том числе вложенные, и иерархии вложенных курсоров (на последние обстоятельства мое внимание обратил ). Например, подправим таблицу EMP следующим образом:
CREATE TYPE typ_va IS VARRAY(10) OF VARCHAR(20); /
CREATE TYPE typ_obj IS OBJECT (city VARCHAR2(20), street VARCHAR2(20)); /
ALTER TABLE emp ADD (xmlc XMLTYPE, vac typ_va, addr typ_obj);
UPDATE emp SET xmlc = XMLTYPE(<a>bbb</a>) , vac = typ_va('Alice', 'Bob') , addr = typ_obj('Ленинград', 'Невский') WHERE ename='SMITH';
COMMIT;
Результат можно наблюдать по старому адресу http://localhost:7778/xsql/myxsql/emps.xsql. Обратите внимание на отсутствие проблем с русскими буквами.
XSQL полезен тем, что позволяет осуществлять публикацию не только в формате XML, но это уже выходит за рамки настоящей статьи.