Работаем с PL/SQL

Сью Хапер,

член 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).


Страница сайта http://www.interface.ru
Оригинал находится по адресу http://www.interface.ru/home.asp?artId=9570