Опубликован: 25.09.2009 | Доступ: свободный | Студентов: 912 / 85 | Оценка: 3.72 / 2.78 | Длительность: 10:50:00
Лекция 9:

Отладка приложения

< Лекция 8 || Лекция 9: 1234 || Лекция 10 >

Функции SQLERRM и SQLCODE

Встроенные функции SQLERRM и SQLCODE возвращают текст и код ошибки для последней исключительной ситуации (рис. 9.7). Эти функции полезно использовать в обработчике OTHERS, так как они позволяют установить причину возникновения ошибки.

Сообщение SQLERRM и SQLCODE

Рис. 9.7. Сообщение SQLERRM и SQLCODE

DBMS_ERROR_CODE

Эта функция возвращает номер последней ошибки, возникшей в базе данных. Эта функция не имеет ограничений в использовании. Для рекурсивных ошибок DBMS_ERROR_CODE возвращает код первого сообщения в стеке. Рассмотрим пример, в котором обработаем ошибку ORA-01438 is "value too large for column", но прежде чем приступить к выполнению примера, обратите внимание на синтаксис функции.

Пример 1. Триггер ON-ERROR. Обработка ошибки

DECLARE
eсode NUMBER := ERROR_CODE;
dbms_ecode NUMBER;
dbms_etext VARCHAR2(200);
BEGIN
 IF ecode = 40508 THEN
  Dbms_ecode := DBMS_ERROR_CODE;
  Dbms_etext := DBMS_ERROR_TEXT;
  IF dbms_ecode = -1438 THEN
   Message('Введенное значение превышает допустимое! Введите заново!);
  ELSE
   Message('Вставка не выполнена, так как '||dbmserrtext);
  END IF;
 END IF;

Обработка NULL - значений

Несмотря на то что обработчик OTHERS ловит все типичные исключительные ситуации, такую ситуацию, как "невведение данных", он обработать не может. Попробуйте в предыдущем примере оставить поле

312

"Делитель" пустым, и вы увидите, что ничего не происходит. Обычно такие ситуации закрываются с помощью настройки определенных свойств элемента. Вы можете установить для поля делитель свойство "Required" равным "True", делая элемент обязательным для ввода. Но можно поступить и по-другому, воспользовавшись функцией NVL, как показано ниже (рис. 9.8).

DECLARE
myexcept exception;
pragma exception_init(myexcept,-1476); 
BEGIN
 :result:=:delimoe/NVL(:delitel,5); 
EXCEPTION
 WHEN myexcept THEN message('Деление на ноль. Делитель должен иметь значение, отличное от нуля'); 
END;
Обработка NULL-значений

Рис. 9.8. Обработка NULL-значений

Правильная обработка исключительных ситуаций имеет большое значение для разработчика, сокращая его время на поиск и обработку ошибок, ускоряя отладку приложения.

Forms Debugger (Debug Console)

В этом разделе мы познакомимся с более мощным инструментом отладки Oracle Forms - Forms Debugger. Forms Debug Console - это инструмент, который дает разработчику контроль над приложением в режиме отладки и полную информацию о текущем состоянии формы и всех выполняющихся внутри нее операций. Отладчик позволяет вам отслеживать выполнение операторов триггеров и программных модулей пошагово, а также дает вам возможность изменять значение переменных. Исследуя среду выполнения отладчиком, вы получаете возможность ана-

лизировать переменные, параметры, системные переменные, значения отображаемых и неотображаемых элементов. Инструмент Debug Console (рис. 9.9) имеет простой интерфейс, представляющий собой рабочую область, на которой вы можете наблюдать ход выполнения программы и значения переменных окружения и внутреннего представления Forms. В Debug Console вы можете управлять видимостью разделов, перечисленных ниже, переключая кнопки на горизонтальной панели отладчика:

  • Stack;
  • Variables;
  • Watch;
  • Form Values;
  • PL/SQL packages;
  • Global/System Variables;
  • Breakpoints.
Debug Console

Рис. 9.9. Debug Console

Для того чтобы лучше понять принцип работы отладчика, рассмотрим все разделы на примере. Для выполнения примера выполните следующие действия:

  1. Создайте форму и назовите ее DEB.fmb.
  2. Создайте небазовый блок и разместите в нем одну кнопку.
  3. Создайте параметр и установите его свойства: Name=result3, Type=number.
  4. Создайте триггер WHEN-BUTTON-PRESSED для кнопки и напишите в нем нижеприведенный код:
    WHEN-BUTTON-PRESSED
    DECLARE
    value1 number;
    value2 number; 
    result1 number; 
    result2 number; 
    result3 number; 
    BEGIN
     value1:=1;
     value2:=2;
     :global.result1:=value1+value2;
     result2:=1/0;
     :parameter.result3:=value2-value1;
    END;

Для того чтобы вызвать Forms Debugger, достаточно нажать кнопку Ш "Run Form Debug", которая находится справа от кнопки "Run Form" в верхней горизонтальной панели Forms. Когда вы попробуете запустить форму в режиме отладки, ничего особенного не произойдет, так как форма будет выполняться в привычном для нее режиме до тех пор, пока не встретит точку прерывания программы.

Breakpoints

Точка останова - это отметка, сообщающая форме, в каком месте нужно остановить выполнение программы и вызвать отладчик. Точки останова можно устанавливать только на выполняемых операторах, то есть точки останова, установленные на операторах типа begin, end, declare, if вызовут сообщение об ошибке. Точка останова имеет вид красной окружности и устанавливается слева от выполняемого оператора, как показано на рис. 9.10.

Для того чтобы установить точку останова, щелкните два раза левой кнопкой мыши на левой вертикальной панели PL/SQL-редактора напротив выполняемого оператора. Вы можете установить точку останова, используя один из перечисленных способов:

  1. Нажатием клавиши F5. Если точка останова уже существует на этом операторе, то она удаляется.
  2. Командой меню Debug | Insert/Remove Breakpoint.

Вы можете устанавливать точки останова как перед запуском формы в режиме отладки, так и после запуска. Установите точки останова на операторах value1, value2, :global.result и запустите форму в режиме отладки. Теперь, когда форма запущена и точки останова установлены, перейдем непосредственно к отладке.

Установка точки останова

Рис. 9.10. Установка точки останова
Текущая точка останова

Рис. 9.11. Текущая точка останова

Для того чтобы приступить к отладке, нажмите кнопку в ранее запущенной форме. После того как вы нажмете кнопку, выполнение кода прервется и на самой первой точке останова появится стрелка, означающая текущую точку входа, как показано на рис. 9.11.

Приступим к рассмотрению разделов Debug Console и начнем с раздела Stack.

< Лекция 8 || Лекция 9: 1234 || Лекция 10 >
Константин Лукин
Константин Лукин

ошибка: FRM47337  Tree node label can not be null

при выполнении скрипта

DECLARE
 Itree ITEM;
 top_node Ftree.Node;
 new_node Ftree.Node;
 i_value VARCHAR2(30);
BEGIN
 Itree := Find_Item('tree_block.tree_item ');
 new_node := Ftree.Add_Tree_Node(Itree, Ftree.ROOT_NODE,
   Ftree.PARENT_OFFSET, Ftree.LAST_CHILD,
   Ftree.EXPANDED_NODE, i_value, NULL, i_value);
END;

Юлия Малыгина
Юлия Малыгина
приведена функция скрытия URL отчета и ее применение, но применения так и нет