ошибка: FRM47337 Tree node label can not be null при выполнении скрипта DECLARE |
Отладка приложения
Функции SQLERRM и SQLCODE
Встроенные функции SQLERRM и SQLCODE возвращают текст и код ошибки для последней исключительной ситуации (рис. 9.7). Эти функции полезно использовать в обработчике OTHERS, так как они позволяют установить причину возникновения ошибки.
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;
Правильная обработка исключительных ситуаций имеет большое значение для разработчика, сокращая его время на поиск и обработку ошибок, ускоряя отладку приложения.
Forms Debugger (Debug Console)
В этом разделе мы познакомимся с более мощным инструментом отладки Oracle Forms - Forms Debugger. Forms Debug Console - это инструмент, который дает разработчику контроль над приложением в режиме отладки и полную информацию о текущем состоянии формы и всех выполняющихся внутри нее операций. Отладчик позволяет вам отслеживать выполнение операторов триггеров и программных модулей пошагово, а также дает вам возможность изменять значение переменных. Исследуя среду выполнения отладчиком, вы получаете возможность ана-
лизировать переменные, параметры, системные переменные, значения отображаемых и неотображаемых элементов. Инструмент Debug Console (рис. 9.9) имеет простой интерфейс, представляющий собой рабочую область, на которой вы можете наблюдать ход выполнения программы и значения переменных окружения и внутреннего представления Forms. В Debug Console вы можете управлять видимостью разделов, перечисленных ниже, переключая кнопки на горизонтальной панели отладчика:
Для того чтобы лучше понять принцип работы отладчика, рассмотрим все разделы на примере. Для выполнения примера выполните следующие действия:
- Создайте форму и назовите ее DEB.fmb.
- Создайте небазовый блок и разместите в нем одну кнопку.
- Создайте параметр и установите его свойства: Name=result3, Type=number.
- Создайте триггер 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-редактора напротив выполняемого оператора. Вы можете установить точку останова, используя один из перечисленных способов:
- Нажатием клавиши F5. Если точка останова уже существует на этом операторе, то она удаляется.
- Командой меню Debug | Insert/Remove Breakpoint.
Вы можете устанавливать точки останова как перед запуском формы в режиме отладки, так и после запуска. Установите точки останова на операторах value1, value2, :global.result и запустите форму в режиме отладки. Теперь, когда форма запущена и точки останова установлены, перейдем непосредственно к отладке.
Для того чтобы приступить к отладке, нажмите кнопку в ранее запущенной форме. После того как вы нажмете кнопку, выполнение кода прервется и на самой первой точке останова появится стрелка, означающая текущую точку входа, как показано на рис. 9.11.
Приступим к рассмотрению разделов Debug Console и начнем с раздела Stack.