Работаем с PL/SQLИсточник: oraclecom
Сью Хапер, член Oracle ACE Источник: журнал Otacle Magazine, #6, 2007г. Редактирование, компиляция, запуск и отладка PL/SQL-кода легко выполняются в Oracle SQL Developer. Наряду с другими возможностями Oracle SQL Developer предоставляет разработчикам баз данных и администраторам разнообразную среду для создания, редактирования, компиляции, выполнения и отладки PL/SQL-программ. Его возможности редактирования включают пользовательскую подсветку синтаксиса, закладки, завершитель кода, развертку кода и поиск/замену. Возможности отладчика особенно полезны для работы с более сложными пакетами, выполнения отладки с пропусками серии процедур, удаленной отладки (отладка инициализируется внешним клиентом или программой). Эта статья знакомит с основными возможностями SQL Developer для работы с PL/SQL базы данных Oracle. Примеры статьи используют демонстрационную схему HR и пакет EMP_FETCHER - и то, и другое доступно при установке базы данных по умолчанию - и объектный тип EMP_REC, который будет создан. В ходе работы с примерами: * выполняются PL/SQL-процедуры, функции и пакеты; * редактирование PL/SQL-кода; * компиляция PL/SQL-кода; * отладка (как локально, так и удаленно) скомпилированного PL/SQL-кода. С чего начать
Выполните следующие действия, чтобы установить примеры, используемые в этой статье: 1. На стартованной базе данных Oracle запустите Oracle SQL Developer. 2. Создайте новое соединение со схемой HR и назовите его HR_ORCL. (Более подробная информация о создании соединения приводится во врезке "Следующие шаги".) 3. Откройте редактор SQL (Tools -> SQL Worksheet) для HR_ORCL. (Он открывается автоматически, когда вы первый раз создаете новое соединение) 4. Введите код Листинга 1 в текстовом окне Enter SQL Statement. Листинг 1: Скрипт для создания объектного типа EMP_REC: CREATE OR REPLACE TYPE EMP_REC AS OBJECT(EMPLOYEE_ID NUMBER(6), LAST_NAME VARCHAR2(25), JOB_ID VARCHAR2(10), MANAGER_ID NUMBER(6), HIRE_DATE DATE, SALARY NUMBER(8, 2), COMMISSION_PCT NUMBER(2,2), DEPARTMENT_ID NUMBER(4)); 5. Нажмите F5 (или кнопку Run Script) для создания объектного типа EMP_REC. 6. Нажмите кнопку Clear или Ctrl-D, чтобы очистить текстовое окно Enter SQL Statement. 7. Создайте спецификацию пакета и его тело, используя, соответственно, код Листингов 2 и 3 в текстовом окне Enter SQL Statement и выполнив каждый из скриптов. (Другой способ создать новый пакет - раскрыть узел HR_ORCL в Connections Navigator, выбрать Packages, и нажать правой кнопкой мыши по пункту меню New Package...). Листинг 2: Скрипт для создания спецификации пакета EMP_FETCHER CREATE OR REPLACE PACKAGE EMP_FETCHER AS FUNCTION GET_EMP(EMP_NO IN NUMBER) RETURN EMP_REC; Листинг 3: Скрипт для создания тела пакета EMP_FETCHER CREATE OR REPLACE PACKAGE BODY EMP_FETCHER AS FUNCTION GET_EMP(EMP_NO IN NUMBER) RETURN EMP_REC IS EMP_FOUND EMPLOYEES % ROWTYPE; EMP_RTN EMP_REC; BEGIN SELECT * INTO EMP_FOUND FROM EMPLOYEES WHERE EMPLOYEES.EMPLOYEE_ID = EMP_NO; EMP_RTN := EMP_REC(EMP_FOUND.EMPLOYEE_ID, EMP_FOUND.LAST_NAME, EMP_FOUND.JOB_ID, EMP_FOUND.MANAGER_ID, EMP_FOUND.HIRE_DATE, EMP_FOUND.SALARY, EMP_FOUND.COMMISSION_PCT, EMP_FOUND.DEPARTMENT_ID); RETURN EMP_RTN; END; END; Чтобы увидеть новый пакет в Connections Navigator, раскройте узел HR_ORCL, а затем раскройте узел Packages. Рис. 1 показывает как выглядят SQL-редактор (worksheet) и Connections Navigator после завершения описанных шагов. Запуск PL/SQL-процедур, функций, пакетов Для запуска любой PL/SQL-процедуры, функции или пакета выберите объект в Connections Navigator, нажмите на него правой кнопкой мыши и выберите Run. Запустим пакет EMP_FETCHER. Откроется диалоговое окно Run PL/SQL, отображающее анонимный PL/SQL-блок и возвращаемое значение. Вы увидите это диалоговое окно при запуске любого PL/SQL-кода в Oracle SQL Developer. Оно показывает детали параметров - и, для функций, возвращаемого значения - для выбранного объекта. Если выбранный объект - пакет, диалоговое окно покажет список процедур и функций, определенных в спецификации пакета. Вы можете выбрать одну из этих процедур или функций для запуска. В PL/SQL-блоке измените EMP_NO := NULL; на EMP_NO := 201; и нажмите OK. В таблице EMPLOYEES 201 - это Рис. 1: Connections Navigator и SQL-редактор существующий сотрудник, поэтому пакет выполняется и завершается с минимальной ответной реакцией. Для сравнения запустите пакет опять для EMP_NO := 2001; (несуществующий сотрудник). После завершения вы увидите сообщение об ошибке "no data found". В этом примере функция извлекает информацию, которая может использоваться в процедуре. Вы можете использовать анонимный блок в диалоговом окне Run PL/SQL, чтобы увидеть детали. Блок содержит строки -- Модифицируйте код для вывода переменной -- DBMS_OUTPUT.PUT_LINE("v_Return = " // v_Return); Если раскомментировать и модифицировать вторую из этих двух строк, можно будет увидеть результат. Функция возвращает запись, или набор элементов, поэтому необходимо указать, какое значение(я) требуется отображать. Можно выбрать и все значения записи. Этот пример использует значения LAST_NAME, HIRE_DATE и SALARY. Раскройте узел Types в Connections Navigator и выберите EMP_REC. Проверьте код. Вернитесь к пакету EMP_FETCHER, и запустите его опять. Измените EMP_NO := 2001 обратно на EMP_NO := 201. Затем замените строку --DBMS_OUTPUT.PUT_LINE("v_Return = " // v_Return); на DBMS_OUTPUT.PUT_LINE("Employee "// emp_no // " is " // v_return.LAST_NAME); DBMS_OUTPUT.PUT_LINE("Hired on the "// v_return.HIRE_DATE // " and earns "// v_return.salary); Нажмите OK, и посмотрите результат в окне Running - Log. Редактирование и компиляция PL/SQL Раскройте пакет EMP_FETCHER в Connections Navigator, чтобы открыть редактор PL/SQL-кода, и дважды щелкните по узлу EMP_FETCHER Body, чтобы открыть две новые группы закладок. Первая группа, только для чтения, легко распознается перечнем закладок в верхней части. Вторая группа - это редактор кода. В Oracle SQL Developer есть завершитель кода (Code Insight), который включает как завершитель параметров (Parameter Insight), так и завершитель вызова (Completion Insight). Завершитель параметров отображает контекстно-зависимое всплывающее меню, которое показывает список процедур или функций пакета. Завершитель вызова отображает контекстно-зависимое всплывающее меню, которое показывает список возможных способов продолжения написания кода от места нахождения курсора, который можно использовать для автозавершения редактируемого кода, где бы он ни редактировался, в редакторе кода или в редакторе SQL. По умолчанию, если нажать точку (.) и подождать чуть больше секунды, завершитель вызова включается автоматически (Вы можете изменить время задержки в настройках предпочтений). Для вызова подсказки вручную, нажмите Ctrl-space. Для проверки работы завершителя вызова наберите: SELECT HR. в редакторе кода Oracle PL/SQL, и подождите. Завершитель вызова покажет всплывающее меню, которое отображает все объекты схемы HR. Нажмите на объект списка, чтобы добавить его в код после курсора. Более полезной может быть функция поиска, предусмотренная во всплывающем завершителе, например, по алиасу таблицы. Наберите SELECT FROM EMPLOYEES e в редакторе кода. Затем наберите e между SELECT и FROM и нажмите Ctrl-space. После паузы, список столбцов таблицы EMPLOYEES будет показан во всплывающем меню. Полное обсуждение возможностей редактирования в Oracle SQL Developer было бы слишком долгим для этой статьи. Я призываю вас самих поэкспериментировать с завершителем кода и другими возможностями редактора кода Oracle PL/SQL, например, сопоставление круглых скобок (кликните на одной скобке и смотрите на подсветку), используемыми до компиляции кода. Когда вы будете готовы компилировать, нажмите кнопку Compile или Ctrl-Shift-F9. Все ошибки компиляции отображаются в окне Compiler-Log. Щелкните дважды по ошибке и перейдите к источнику ошибки. Отладка PL/SQL-кода Даже если PL/SQL-код успешно компилируется и запускается, это не означает, что он работает так, как хотелось бы. Это как раз тот случай, когда необходима отладка. Для отладки кода необходимо установить одну или несколько точек останова, а затем выбрать Compile for Debug. В результате PL/SQL-код будет откомпилирован с отладочной информацией. Если затем запустить этот код в режиме отладки, он выполнится до точки останова. Точки останова могут настраиваться; например, можно связать точки останова с любым необработанным исключением или с предопределенным исключением Oracle Database (Если вы отлаживаете PL/SQL в базе данных версии до Oracle9IDatabase Release 2, то для отладки PL/SQL необходимо установить предпочтение Migration -> PL/SQL Debugger в Use Probe Debugger). Основные возможности отладки в Oracle SQL Developer позволяют контролировать выполнение программы. Например, можно переходить по каждой строке кода или через процедуру или функцию. Oracle SQL Developer отображает значения переменных и данных на каждом шаге кода. Пошаговое выполнение кода полезно при отладке процедуры, которая вызывает функцию. Не обязательно проходить по всем строкам функции, так как можно перескочить через неё и вернуться в отлаживаемую процедуру. Локальная и удаленная отладка в Oracle SQL Developer Использование Oracle SQL Developer для локальной отладки PL/SQL означает, что вы выбираете и присоединяетесь к PL/SQL-программе, используя SQL Developer Connections Navigator. Вы устанавливаете точку останова в том месте, где отладчик должен сделать паузу, и затем нажимаете кнопку Debug. Oracle SQL Developer стартует отладочный сеанс, соединяется с ним, и останавливается, когда достигнет точки останова. При локальной отладке Oracle SQL Developer - это клиент, который инициирует отладку. Удаленная отладка PL/SQL-кода в Oracle SQL Developer означает, что вы инициируете отладочную акцию с клиента, внешнего по отношению к Oracle SQL Developer. Внешние клиенты могут быть PL/SQL Web-приложениями, приложениями Oracle Application Express или сессиями SQL*Plus. Удаленная отладка требует некоторых ручных действий: запуск отладочного листенера Oracle SQL Developer и присоединение к этому листенеру через сессию базы данных, которую требуется отладить (Удаленная отладка недоступна для баз данных, версия которых ниже Oracle9I Database Release 2). Следующие шаги описывают пример удаленной отладочной сессии: 1. В Oracle SQL Developer присоединитесь к базе данных, где находится PL/SQL-код. Используйте ту же строку соединения HR_ORCL и пакет EMP_FETCHER, которые использовались ранее. 2. Выберите соединение HR_ORCL в Connections Navigator, и затем щелкните правой кнопкой мыши и выберите Remote Debug. Откроется диалоговое окно Listen for JPDA. 3. Введите порт и IP-адрес сервера. Теперь вы видите новое окно Run Manager, на котором отображается информация о сервере Debug Listener. (Можно установить Tools -> Preferences -> Debugger -> Prompt for Debugger Host для отладки, когда соединение выполняется через бранмауэр или сессии виртуальных частных сетей [virtual private network - VPN] ). 4. В Connections Navigator выберите тело пакета EMP_FETCHER, затем щелкните правой кнопкой мыши и выберите Edit..., чтобы открыть редактор кода Oracle PL/SQL. Кликните в левом поле на FUNCTION GET_EMP..., чтобы установить точку останова. 5. Кликните Compile for Debug как показано на Рис. 2. 6. Теперь вы готовы к тому, чтобы начать удаленный процесс отладки со стороны Oracle SQL Developer. Для этого необходимо, чтобы был готов внешний клиент, в Рис. 2: Компиляция с отладочной информацией данном случае SQL*Plus. Запустите сессию в SQL*Plus для того же самого пользователя базы данных, и введите IP-адрес и порт, заменив на ваши собственные, которые использовались для удаленного подключения в Oracle SQL Developer: exec DBMS_DEBUG_JDWP.CONNECT_TCP ("127.0.0.1", 4000) 7. В SQL*Plus используйте анонимный блок для вызова функции: DECLARE EMP_NO NUMBER; v_Return HR.EMP_REC; BEGIN v_Return := EMP_FETCHER.GET_EMP(201); END; / 8. Теперь управление передано Oracle SQL Developer и вы можете выполнять код по шагам. Начиная с этого момента процесс такой же, как при локальной отладке. Стали активны различные отладочные окна. Все они имеют свое назначение, однако важными сразу же становятся: • Окно Debugging, которое позволяет управлять выполнением программы. Начните отладку, нажимая пиктограмму Step Into. • Редактор кода, который показывает точку выполнения. Когда отладка выполняется по шагам, при перемещении мыши всплывающие подсказки отображают название и значение переменной под указателем. Продолжайте нажимать Step Into до тех пор пока не достигните строки EMP_RTN:= EMP_REC.... В этой точке дайте мыши переместиться к переменной EMP_FOUND, чтобы увидеть всплывающую подсказку, как показано на Рис. 3. • Окно Data отображает все переменные, которые действительны в текущем контексте. Перейдя на точку выполнения EMP_RTN := EMP_REC..., выберите закладку Data и раскройте узел EMP_FOUND. Теперь запись заполнена. В этой точке можно просматривать и модифицировать переменные, чтобы увидеть их влияние на процедуру. 9. Продолжайте шаги до тех пор, когда процедура завершится, управление будет передано внешнему клиенту, и отладочная сессия завершится. 117 Рис. 3: Использование Step Into и всплывающей подсказки Заключение В Oracle SQL Developer можно просматривать и редактировать объекты базы данных, данные запросов и выпускать отчеты. Одна из полезных возможностей Oracle SQL Developer - это способность редактирования, компиляции, выполнения и отладки PL/SQL. Oracle SQL Developer поддерживает как локальную так и удаленную отладку; возможности удаленной отладки позволяют подхватить отладочную сессию PL/SQL в Oracle SQL Developer от внешних клиентов (таких, как SQL*Plus). |