по значению – значение фактического параметра копируется в соответствующий формальный параметр (если впоследствии программа завершается без необработанных исключений, то значение формального параметра присваивается обратно фактическому).
Понятно, что для режима передачи значений параметров IN используется передача параметров по ссылке (ведь IN-параметры не изменяются внутри процедур и функций, поэтому значение достаточно только читать по ссылке). Для режимов OUT и IN OUT обычно используется передача по значению.
Ошибки компиляции программ PL/SQL
На практике в большинстве случаев первая попытка откомпилировать программу на языке PL/SQL приводит к получению сообщения о наличии ошибок в ее коде. Чтобы увидеть выявленные компилятором ошибки, можно воспользоваться командой утилиты SQL*Plus SHOW ERRORS. Если команда SHOW ERRORS используется без параметров, то возвращаются ошибки последней компилированной программы.
Создадим процедуру PL/SQL с синтаксической ошибкой (пропущен символ ; после команды NULL):
SQL> CREATE PROCEDURE proc1 AS
2 BEGIN
3 NULL
4 END;
5 /
Warning: Procedure created with compilation errors.
SQL> SHOW ERRORS
Errors for PROCEDURE PROC1:
LINE/COL ERROR
– –
4/1 PLS-00103: Encountered the symbol "END" when expecting one of the
following: ; The symbol ";" was substituted for "END" to continue.
Попробуем создать процедуру c другой ошибкой:
SQL> CREATE OR REPLACE PROCEDURE test(p1 IN INTEGER,
2 p2 OUT INTEGER,
3 p3 IN OUT INTEGER) IS
4 l_p INTEGER := 10;
5 BEGIN
6 p1 := l_p;
7 END;
8 /
Warning: Procedure created with compilation errors.
SQL> SHOW ERRORS
Errors for PROCEDURE TEST:
LINE/COL ERROR
– –
6/3 PL/SQL: Statement ignored
6/3 PLS-00363: expression 'P1' cannot be used as an assignment target
В коде процедуры test имеется семантическая (смысловая) ошибка – попытка изменить значение параметра с режимом передачи IN. Компилятор PL/SQL при анализе кода проверяет отсутствие таких параметров в левой части команд присваивания, в конструкциях SELECT INTO и в других местах кода, где значения таких параметров может быть изменено.
В обоих случаях процедуры proc1 и test как новые объекты базы данных создавались, но с ошибками (Procedure created with compilation errors). Такие объекты базы данных получают статус INVALID и непригодны для использования.
Попытка вызвать процедуру test приведет к ошибке:
SQL> DECLARE
2 l_arg1 INTEGER :=5;
3 l_arg2 INTEGER :=6;
4 l_arg3 INTEGER :=7;
5 BEGIN
6 test(p1 => l_arg1,p2 => l_arg2,p3 => l_arg3);
7 END;
8 /
test(p1 => l_arg1,p2 => l_arg2,p3 => l_arg3);
*
ERROR at line 6:
ORA-06550: line 6, column 3:
PLS-00905: object USER1.TEST is invalid
ORA-06550: line 6, column 3:
PL/SQL: Statement ignored
Хранимая программа PL/SQL может получить статус INVALID как из-за наличия в ее коде синтаксических и семантических ошибок, так и по другим причинам, например, если какие-то объекты базы данных, к которым есть обращения в коде программы, стали недоступными (были удалены, были отозваны привилегии доступа к ним и т. п.).
Отладка программ на PL/SQL
Исправлять ошибки, выявленные компилятором PL/SQL в ходе анализа кода, обычно довольно просто. Для исправления выявленных пользователями ошибок этапа выполнения, следует использовать отладчик PL/SQL. Для удобства отладки можно порекомендовать использовать специализированные средства, например, интегрированную среду разработки Quest SQL Navigator, в которой есть и breakpoints, и watches, и step into, и step over – в общем, все средства, достаточные для эффективной отладки программ на процедурном языке программирования.
Для использования отладчика отлаживаемую программу PL/SQL необходимо перекомпилировать с опцией добавления отладочной информации.
SQL> ALTER PROCEDURE insRec COMPILE DEBUG;
Procedure altered.
Редактировать код хранимых программ по опыту авторов также рекомендуется в специализированном Stored Program Editor, который есть в Quest SQL Navigator, TOAD, PL/SQL Developer и Oracle SQL Developer:
после открытия в редакторе исходного текста хранимой программы с ошибками курсор в тексте сразу позиционируется на место ошибки с отображением сообщения об ошибке;
в Stored Program Editor редактируется актуальная версия кода, которая находится в словаре-справочнике данных базы данных Oracle;
есть стандартные для современных IDE подсветка синтаксиса и автодополнение кода, что очень удобно;
нажатием клавиш Ctrl+S или соответствующей кнопки интерфейса можно быстро отправить код программы на компиляцию.
Объединенные общим функциональным назначением процедуры и функции принято оформлять в виде пакета PL/SQL. Можно считать, что пакет – это аналог библиотеки программ. Прием оформления родственных программ в библиотеки хорошо известен из практики разработки программного обеспечения. В информационной системе с развитой серверной бизнес-логикой могут быть тысячи процедур и функций на языке PL/SQL. Чтобы они не лежали в базе данных тысячами объектов, правильно объединить их по функциональному признаку в пакеты, дав им названия, соответствующие области применения. Например, в базе данных могут быть такие пакеты:
Читать дальше