Oracle DB, Oracle APEX, Linux etc.

пятница, 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. Не забывайте делиться своими решениями.

Читать далее

понедельник, 15 октября 2012 г.

APEX 4.2 ушёл в печать!

http://www.oracle.com/technetwork/developer-tools/apex/downloads/index.html

PS: Что-то я редко стал сюда что-нибудь добавлять... Потому анонс: в следующих сообщениях расскажу о создании плагинов. Начнём с плагина-региона.
Читать далее

пятница, 22 июня 2012 г.

Oracle APEX 4.2 EA1 ушёл в народ!

На официальной странице APEX появилась приятная новость о доступном Early Adapter (как Oracle именует публичные беты продуктов).
  1. Регистрируйтесь!
  2. Пробуйте!
  3. Пишите предложения и жалобы!
Приятных выходных! ;)
Читать далее

суббота, 12 мая 2012 г.

Oracle APEX: Мелочь, а не хватает...

Казалось бы, не так велик труд: выбрать что-то при редактировании страницы и удалить. Но будь возможность делать это сразу из всплывающего меню! При интенсивном редактировании страницы надоедает вначале заходить в редактировании того же региона, или кнопки, или поля, или... А потом уже DELETE, "Да, я согласен" и обратно к редактированию страницы.

На всякий случай добавил в APEX 4.2 Wish List.
Читать далее

суббота, 10 марта 2012 г.

Oracle APEX Listener: Файл настроек

Это небольшая заметка о файле настроек Oracle APEX Listener (OAL), развёрнутом на GlassFish 3.

По умолчанию OAL создаёт и ищет файл настроек ${java.io.tmpdir}/apex/apex-config.xml, где значение java.io.tmpdir для GlassFish установлено в /tmp. Любые временные директории — не место для хранения файлов настроек, поскольку время от времени их содержимое удаляется.

Чтобы изменить это поведение раз и навсегда, необходимо:
  1. Распаковать файл apex.war. Это обычный zip-архив, проблем с разархивацией возникнуть не должно. Например, разархивируем архив в директорию tmp:
    unzip -d tmp apex.war
  2. Изменить параметр config.dir в файле WEB-INF/web.xml. Найдём в нём следующие строки, устанавливающие значение параметра:
    <!--
      <context-param>
        <param-name>config.dir</param-name>
        <param-value>${java.io.tmpdir}/APEX</param-value>
      </context-param>
    -->
    
    Раскомментируем и заменим значение параметра:
      <context-param>
        <param-name>config.dir</param-name>
        <param-value>${user.dir}</param-value><
      </context-param>
    
    Параметр user.dir для приложения, развёрнутого на GlassFish в домен domain_1, будет иметь значение <Директория GlassFish>/glassfish/domains/domain_1/config. OAL создаст по этому пути поддиректорию apex и разместит файл настроек apex-config.xml в ней.
  3. Создать архив apex.war с изменённым файлом. Перейдём в директорию tmp и соберём архив:
    zip -r apex.war ./*

Всё, архив с приложением готов к установке.

Читать далее