Использование
Рассмотрим простейший пример с использованием пакета WOW.
При обращении к WWW - серверу
www.cnit.nsu.ru
по URL:
http://www.cnit.nsu.ru/cgi-bin/wow.win/example.test?answer=no
происходит следующая цепочка действий
(см. ):
это обращение как запуск CGI - программы
wow.win.
интерпретирует параметры как вызов процедуры test
пакета example
с параметром answer
имеющим значение no,
созданной в схеме WWW
сервера Oracle.
эту процедуру и все процедуры и функции,
вызываемые из нее. Выходные
данные, представляющие динамически
созданный HTML - документ,
передаются программе wow.win.
выходной документ в кодировку Microsoft
CodePage 1251, используемую в Windows
- приложениях, и передает
его WWW - серверу.
созданный документ, как результат
запроса, WWW - клиенту.
URL, обращающийся к процедуре
PL/SQL должен быть построен
по определенным правилам и содержать ряд элементов:
находящийся в каталоге CGI
- программ. Расширение
программы wow
- .koi8, .win, .iso,
.alt определяет кодировку WWW
- клиента:
Например:
http://www.cnit.nsu.ru/cgi-bin/wow.win
которой происходит обращение. Модули
пакета используют схему и регистрационные данные пользователя
www
БД Oracle. Таким образом,
вызываемая PL/SQL - процедура
должна быть доступна пользователю www
на исполнение. Если
процедура (test)
создана прямо в схеме www,
необходимо просто указать ее имя:
http://www.cnit.nsu.ru/cgi-bin/wow.win/test
Если процедура входит в состав пакета
(example), созданного в схеме www,
необходимо добавить имя пакета и имя процедуры:
http://www.cnit.nsu.ru/cgi-bin/wow.win/example.test
Когда пакет создан в другой
схеме Oracle, необходимо указывать
и имя схемы. Например,
для схемы fancy
получим:
http://www.cnit.nsu.ru/cgi-bin/wow.win/fancy.example.test
Пользователь www
должен иметь права на исполнение этой процедуры,
явно предоставленные оператором GRANT
языка SQL.
разделитель '?', начинают
перечисляться параметры процедуры и их значения в виде пар:
<название_параметра>
= <значение_параметра>
между собой, различные параметры
разделяются амперсандом '&':
<название_параметра1>=<значение_параметра1>&<название_параметра2>=
<значение_параметра2>
Название параметра должно совпадать с названием параметра вызываемой
процедуры. Число параметров
должно в точности соответствовать числу параметров процедуры.
Если хотя бы одно из этих требований не соблюдено,
Вы получите сообщение об ошибке.
Порядок указания параметров значения не имеет.
Большие и маленькие буквы в названии параметров равнозначны.
Число реально передаваемых параметров может и не совпадать с числом
параметров, указанных в спецификации
процедуры. В этом случае,
все опускаемые параметры должны иметь значения по умолчанию.
Пример:
http://www.cnit.nsu.ru/cgi-bin/wow.win/example.test?answer=no
Исходя из описанного механизма работы пакета WOW
можно сформулировать основные требования к PL/SQL
- процедурам, обрабатывающим
запросы от WWW - сервера.
через WOW в процедуру всегда
имеют тип varchar2. Если Вы
хотите использовать какой - либо другой тип данных,
необходимо использовать функции преобразования из varchar2.
функции вывода начала и конца HTML
- документа. Поскольку
многие современные броузеры интерпретируют текст без обрамляющих
тегов <HTML> ... </HTML>
как преформатированный, необходимо
прямо задавать эти теги в начале и конце документа.
Пример пакета example:
Create or Replace package example is
procedure test(answer in Varchar2);
end;
/
Create or Replace package body example
is
procedure test(answer in Varchar2) is
ответ varchar2(3);
cursor c_man(ans in varchar2) is select
Фамилия from Результаты_опроса where Ответ=ans order by Фамилия;
begin
-- Начало документа
htp.p('<HTML>');
-- Вывод названия страницы и заголовка
if answer = 'no'
then
ответ:='НЕТ';
htp.htitle('Фамилии людей, ответивших
отрицательно');
else
ответ:='ДА';
htp.htitle('Фамилии людей, ответивших
положительно');
end if;
htp.olistopen;
-- Начало нумерованного списка
for man in c_man(Ответ) loop
-- Элемент списка
htp.item(man.Фамилия);
end loop;
-- Конец нумерованного списка
htp.olistclose;
-- Конец документа
htp.p('</HTML>');
end;
end;
/
При этом подразумевается что в схеме WWW
Oracle находится таблица примерно следующей структуры:
Create table Результаты_опроса(Фамилия
varchar2(30),
Имя varchar2(14),
Отчество varchar2(20),
Ответ varchar2(3));
Обращаться к пакету WOW можно и из форм HTML.
Ниже приведен пример обращения к тому же пакету example
из простейшей формы.
<HTML>
<HEAD>
<TITLE>Тестовая форма</TITLE>
</HEAD>
<BODY>
<H1>Тестовая форма</H1>
<FORM ACTION="http://www.cnit.nsu.ru/cgi-bin/wow.win/example.test">
Введите ответ:<INPUT NAME="answer">
<INPUT VALUE="Найти" TYPE="SUBMIT">
</FORM>
</BODY>
</HTML>