Свой маленький APEX или как "изобрести велосипед"
11.01.2016

Наверное у многих разработчиков на APEX возникал вопрос "Как это работает?"
Не стану детально все расписывать, для этого понадобится целая книга. Лучше покажу на простом примере как сделать тоже, что делает APEX, а именно, как сгенерировать HTML страницу и выдать ее по запросу пользователя. Пример для конфигурации APEX Embedded PL/SQL Gateway (EPG).
Начнем от браузера, вернее от адресной строки. Типичный пример URL страницы APEX http://myserver:8080/apex/f?p=100:1:1311836722169.
Подробно про структуру URL написано в документации Understanding URL Syntax - Oracle Documentation, но про вот этот элемент "f?p=" сказано весьма сухо. Попытаюсь раскрыть эту тему подробнее:
f - это имя процедуры, которая первая получает управление от Listener-a. Здесь можно получить дополнительную информацию.
? - разделитель между названием процедуры и ее параметрами
p - название параметра процедуры. После знака равенства значение параметра.

Вооружившись этой информацией, сделаем свой APEX.

1. Создадим свой собственный DAD с именем MYAPEX. Для этого под пользователем SYS выполним скрипт:
 

BEGIN
  dbms_epg.create_dad('MYAPEX','/myapex/*');
  dbms_epg.set_dad_attribute('MYAPEX','database-username','ANONYMOUS');
  dbms_epg.set_dad_attribute('MYAPEX','request-validation-function','appx.validation_function');
END;


2. В своей схеме, например APPX, создаем функцию "validation_function":



CREATE OR REPLACE FUNCTION validation_function(procedure_name IN VARCHAR2) RETURN BOOLEAN IS
  l_result BOOLEAN := FALSE;
BEGIN
  IF UPPER(procedure_name) IN ('PAGE', 'APPX.PAGE') THEN
    l_result := TRUE;
  END IF;
  RETURN l_result;      
END;

Данная функция проверяет и разрешает или запрещает вызов из HTTP запроса процедуры переданной в параметре "procedure_name".

3. В своей схеме APPX создаем процедуру "page":


create or replace procedure page(arg IN VARCHAR2 := NULL) is
begin
  htp.htmlopen;
  htp.headopen;
  htp.title('Hello');
  htp.headclose;
  htp.bodyopen;
  htp.p(arg);
  htp.bodyclose;
  htp.htmlclose;
END;

Это процедура и есть основной движок нашего "APEX-а", которая генерирует HTML страницу.

4. На созданные процедуры выдаем привилегии пользователю PUBLIC:



GRANT EXECUTE ON appx.validation_function TO PUBLIC;
GRANT EXECUTE ON appx.page TO PUBLIC;


Собственно все.

Открываем браузер. Вводим http://myserver:8080/myapex/appx.page?arg=test_ok и получаем простейшую HTML страницу с надписью test_ok.

Название схемы из адресной сроки можно убрать. Для этого достаточно создать публичный синоним:
CREATE PUBLIC SYNONYM page FOR appx.page;
Тогда URL немного упростится: http://myserver:8080/myapex/page?arg=test_ok

release 1.0