Oracle DB, Oracle APEX, Linux etc.

понедельник, 19 августа 2013 г.

Плагин TabGrid

Небольшая вариация на тему грида Ext JS в APEX: http://apex.oracle.com/pls/otn/apex/f?p=40749:1
Логин/пароль: demo/demo

Направление развития: фильтры, работающие на сервере.

PS: Есть желание замахнуться на небольшой фреймворк в качестве альтернативы FOEX.
Читать далее

пятница, 31 мая 2013 г.

Oracle: запрос для отображения комментариев к таблице в виде DDL

Простой запрос для получения готовых DDL-операторов COMMENT с комментариями к таблице и её столбцам:

with par as (
  select nvl('&owner', user) owner -- Владелец схемы с таблицей
       , '&table_name' table_name  -- Таблица
    from dual
)
select ddl_stmt 
  from (select p.owner
             , p.table_name
             , '' column_name
             , comments
             , 'comment on table "'||p.owner||'"."'||p.table_name||'" is ''' || comments ||''';'  ddl_stmt
          from par p 
            left join 
               all_tab_comments tc on p.owner = tc.owner and p.table_name = tc.table_name 
         union all
        select c.owner
             , c.table_name
             , c.column_name
             , tc.comments
             , 'comment on column "'||c.owner||'"."'||c.table_name||'"."'||c.column_name||'" is ''' || comments ||''';'  ddl_stmt
          from (select owner, table_name, column_name 
                  from par p natural join all_tab_columns c) c
            left join 
                all_col_comments tc on c.owner = tc.owner and c.table_name = tc.table_name and c.column_name = tc.column_name)
 order by owner, table_name, column_name nulls first
/

Полезен как заготовка в ситуациях, когда нужно создать скрипт добавления или изменения комментариев к таблице.
Читать далее

четверг, 14 марта 2013 г.

Oracle APEX: Remote Debug

Случайно узнал, что можно включить удалённую отладку установкой в URL значения REMOTE для аргумента Debug. При этом подключение для удалённой отладки происходит в самом начале этапов Page Processing и Page Rendering и создаётся к удалённому хосту из переменной REMOTE_ADDR окружения CGI на порт 4000.

В документации об этом почему-то ни слова.

Пользуясь случаем, напоминаю, что уровнем отладки (и количеством выдаваемой информации) можно управлять, используя значения LEVELn для аргумента Debug, где n -- уровень отладки от 1 до 9. По умолчанию, для значения YES используется уровень 4.

Читать далее

четверг, 14 февраля 2013 г.

Oracle APEX: Report Template Preview

Да, я знаю, что обещал заметку о том, как создавать плагин-регион. Но пока я её готовлю, могу предложить описание поиска ошибки в APEX Application Builder и её исправления.

Ошибка заключается в том, что в APEX уже довольно давно поломался предпросмотр шаблонов отчётов.


Для шаблонов страниц работает, для регионов тоже, а отчёты показывают крайне информативное сообщение:
report error: 
ORA-01002: fetch out of sequence

Как всё поправить? Для начала, нужно разобраться, что выполняется на странице. Смотрим в адресную строку:
/apex/f?p=4000:245:7846987198961::::F4000_P245_ID:2451412072364242

Заглядываем в словарь APEX, что там за регионы на странице 245 приложения 4000:
column region_name format a20
column region_id format 999999999999999999999999
column source_type format a15
column region_source format a80
set long 700
select region_name, region_id, source_type, region_source 
  from apex_040200.apex_application_page_regions 
 where application_id = 4000 and page_id = 245
/
REGION_NAME                          REGION_ID SOURCE_TYPE     REGION_SOURCE                                                                  
-------------------- ------------------------- --------------- --------------------------------------------------------------------------------
Breadcrumb                    6539000463209372 Breadcrumb                                                                                       
Template Preview             14562627207747006 PL/SQL          wwv_render_report3.show(                                                         
                                                                   p_query => '                                                                 
                                                               select 1 COL1, ''[...]'' COL2, ''[...]                                           

Template Preview             14573702151806062 HTML/Text       

This page provides a preview of the identified report template.

Template Details 82014114667920662 Report select ROW_TEMPLATE_NAME N, ROW_TEMPLATE_TYPE T from WWV_FLOW_ROW_TEMPLATES preview-report 88449328191587806 Report select 1 COL1, '[...]' COL2, '[...]' COL3, sysdate COL4 from dual union select

Судя по названиям и содержимому, нас интересуют регионы с REGION_ID 14562627207747006 и 88449328191587806. Первый выполняет обращение к wwv_render_report3.show, второй, как мы сейчас увидим, служит для хранения настроек, которые используются в этом вызове:
column region_source format a700
set long 700
select region_id, region_source 
  from apex_040200.apex_application_page_regions 
 where region_id in (14562627207747006, 88449328191587806)   
/
REGION_ID REGION_SOURCE
------------------------- --------------------------------------------------------------------------------
        14562627207747006 wwv_render_report3.show(
                              p_query => '
                          select 1 COL1, ''[...]'' COL2, ''[...]'' COL3, sysdate COL4 from dual union
                          select 2 COL1, ''[...]'' COL2, ''[...]'' COL3, sysdate COL4 from dual union
                          select 3 COL1, ''[...]'' COL2, ''[...]'' COL3, sysdate COL4 from dual union
                          select 4 COL1, ''[...]'' COL2, ''[...]'' COL3, sysdate COL4 from dual union
                          select 5 COL1, ''[...]'' COL2, ''[...]'' COL3, sysdate COL4 from dual union
                          select 6 COL1, ''[...]'' COL2, ''[...]'' COL3, sysdate COL4 from dual
                          order by 1',
                              p_row_template_id => :f4000_p245_id,
                              p_region_id => 88449328191587806
                            );

        88449328191587806 select 1 COL1, '[...]' COL2, '[...]' COL3, sysdate COL4 from dual union
                          select 2 COL1, '[...]' COL2, '[...]' COL3, sysdate COL4 from dual union
                          select 3 COL1, '[...]' COL2, '[...]' COL3, sysdate COL4 from dual union
                          select 4 COL1, '[...]' COL2, '[...]' COL3, sysdate COL4 from dual union
                          select 5 COL1, '[...]' COL2, '[...]' COL3, sysdate COL4 from dual union
                          select 6 COL1, '[...]' COL2, '[...]' COL3, sysdate COL4 from dual
                          order by 1
Значит, путь наш лежит в wwv_render_report3.show. Чтобы посмотреть, что именно там происходит, потребуется разврапировать тело пакета и установить его в схему APEX. Тело находится в файле reports3.plb.

Затем включить удалённую отладку, для чего потребуется скомпилировать этот пакет с поддержкой отладки. Ещё в рамках подготовки к удалённой отладке потребуется временно изменить содержимое региона 14562627207747006, окружив вызов обращениями к dbms_debug_jdwp:
update wwv_flow_page_plugs 
   set plug_source = q'{dbms_debug_jdwp.connect_tcp('localhost',50001);  
wwv_render_report3.show(
    p_query => '
select 1 COL1, ''[...]'' COL2, ''[...]'' COL3, sysdate COL4 from dual union 
select 2 COL1, ''[...]'' COL2, ''[...]'' COL3, sysdate COL4 from dual union 
select 3 COL1, ''[...]'' COL2, ''[...]'' COL3, sysdate COL4 from dual union 
select 4 COL1, ''[...]'' COL2, ''[...]'' COL3, sysdate COL4 from dual union 
select 5 COL1, ''[...]'' COL2, ''[...]'' COL3, sysdate COL4 from dual union 
select 6 COL1, ''[...]'' COL2, ''[...]'' COL3, sysdate COL4 from dual 
order by 1',
    p_row_template_id => :f4000_p245_id,
    p_region_id => 88449328191587806
  );
dbms_debug_jdwp.disconnect;}'
 where id = 14562627207747006
/
Я использую localhost как имя удалённого хоста, потому что пробросил через SSH свой порт 4000, на котором работает Debug Listener, на порт 50001 сервера с Oracle. Если файерволы Вам позволяют, можете вместо localhost указывать IP машины, на которой работает OSD с удалённой отладкой, тогда порт необходимо указать тот, который выбрали при запуске Remote Debug.


Итак, подготовились к отладке, запустили Remote Debug, зашли на страницу с предпросмотром шаблона отчёта. Началась отладка. За несколько итераций становится ясно, что ошибка возникает при попытке фетчить открытый курсор с запросом отчёта, который ещё не был выполнен. А происходит это, потому что в вызове wwv_render_report3.show не указано значение параметра p_plug_source_type. Исправляем:
update wwv_flow_page_plugs 
   set plug_source = q'{wwv_render_report3.show(
    p_query => '
select 1 COL1, ''[...]'' COL2, ''[...]'' COL3, sysdate COL4 from dual union 
select 2 COL1, ''[...]'' COL2, ''[...]'' COL3, sysdate COL4 from dual union 
select 3 COL1, ''[...]'' COL2, ''[...]'' COL3, sysdate COL4 from dual union 
select 4 COL1, ''[...]'' COL2, ''[...]'' COL3, sysdate COL4 from dual union 
select 5 COL1, ''[...]'' COL2, ''[...]'' COL3, sysdate COL4 from dual union 
select 6 COL1, ''[...]'' COL2, ''[...]'' COL3, sysdate COL4 from dual 
order by 1',
    p_row_template_id => :f4000_p245_id,
    p_region_id => 88449328191587806,
    p_plug_source_type => 'SQL_QUERY'
  );}'
 where id = 14562627207747006
/

Проверяем:


Вот так ищутся и правятся небольшие баги в APEX. Не забывайте делиться своими решениями.

Читать далее