24 июн. 2008 г.

PL/SQL HTTP сервис

Заметка о том, как вызвать процедуру PL/SQL через URL и получить результат в HTTP. Постараюсь быть кратким. Используется Oracle 10 XE с установленным XMLDB. Все подробности по этой опции в документации. Отмечу лишь, что для настройки нужно обладать ролью XDBADMIN.

Итак. Для начала смотрим на каком порту слушает XMLDB:
select DBMS_XDB.GETHTTPPORT() from dual;

Можно установить любой другой порт по желанию:
exec dbms_xdb.sethttpport(8080);

Синтаксис URL будет следующий: http://host:port/dad/procedure?parameter=value

Создадим DAD:
begin
dbms_epg .create_dad('dad', '/dd/*');
end;
/

здесь первый параметр - имя DAD (внутреннее, для последующего использования в настройках), второй - путь (используется в URL при запуске). Вобщем не обязаны быть похожими.

Впринципе уже можно пробовать запускать какую-нибудь процедуру типа helloworld:
create or replace procedure helloworld as
begin
htp.p('hello world');
end helloworld;
/


через URL http://localhost:8080/dd/HELLOWORLD

В этом моменте вы должны получить запрос на авторизацию - вводить нужно имя и пароль того пользователя, в схеме которого находится запускаемая процедура или (как вариант) одноименный синоним, указывающий на процедуру в другой схеме. Т.е. в именном пространстве этого пользователя должен существовать запускаемый объект с соответсвующими привилегиями.

Следующий шаг - это сделать так, чтобы при запуске URL избежать запроса авторизации, а запустить процедуру с привилегиями предопределенного пользователя. Для этого нужно выполнить
begin
dbms_epg.set_dad_attribute('dad','database-username','TT');
end;
/

Первый параметр - имя DAD, второй - имя аттрибута DAD (оставить без изменений), третий - имя нужного пользователя.

И авторизуем DAD:
begin
dbms_epg.authorize_dad('dad', 'TT') ;
end;
/


Еще понадобиться выполнить следующий код:
declare
l_xml_config sys.xmltype;
anonymous_already_set exception;
pragma exception_init(anonymous_already_set,-30936);
begin
select insertchildxml(xdburitype('/xdbconfig.xml').getxml(),'/xdbconfig/sysconfig/protocolconfig/httpconfig','allow-repository-anonymous-access',
xmltype('true'),
'xmlns="http://xmlns.oracle.com/xdb/xdbconfig.xsd"') into l_xml_config from dual;
dbms_xdb.cfg_update(l_xml_config);
commit;
exception
when anonymous_already_set then
null;
end;
/


Это нужно для того, чтобы разрешить XMLDB анонимные соединения. Потому что несмотря на то, что мы указываем имя пользователя DAD по-умолчанию, физически соединение происходит под ANONYMOUS.

Комментариев нет: