Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Шрифт:
WHERE sales_rep = :emp_num
INTO :any_sales;
IF (any_sales > 0) THEN
EXCEPTION reassign_sales;
В случае если такие записи заказов будут найдены, процедура аккуратно завершается на операторе EXCEPTION, который при отсутствии обработчика исключений передает выполнение прямо на самый последний оператор END процедуры. В этих условиях процедура завершается, а сообщение об исключении передается вызвавшей программе [115] .
115
Эта
Если нет исключения, выполнение продолжается. Затем процедура должна выполнить небольшую работу по изменению некоторых позиций вакантной должности (NULL), если она сохраняется для нашего служащего, удалить служащего из проектов и удалить его (или ее) историю продаж. Под конец удаляется сама запись служащего.
UPDATE department
SET mngr_no = NULL
WHERE mngr_no = :emp_num;
UPDATE project
SET team_leader = NULL
WHERE team_leader = :emp_num;
DELETE FROM employee_project
WHERE emp_no = :emp_num;
DELETE FROM salary_history
WHERE errp_no = :emp_num;
DELETE FROM employee
WHERE errp_no = :emp_num;
Работа сделана, служащий ушел. Необязательный оператор EXIT может быть включен в текст с целью документирования. Он может быть весьма полезным, если вы просматриваете скрипты, содержащие множество определений процедур, а эти процедуры имеют много вложенных блоков BEGIN ... END:
EXIT;
END ^ COMMIT ^
В этой процедуре мы заметили два различных способа использования префикса двоеточия в переменных.
* Раньше применялось обращение к локальной переменной -.ANY SALES, когда она использовалась в предложении INTO для помещения элемента данных, возвращаемого оператором SELECT.
* В более поздних операторах она использовалась с другими целями. Синтаксис PSQL требует наличия префикса двоеточия для любой переменной или аргумента, когда они используются в операторе DSQL.
Эти два способа использования префикса двоеточия являются постоянными в PSQL. Если вы забыли, где их нужно применять, или используете их там, где PSQL не требует, то ваша процедура не будет компилироваться, а синтаксический анализатор вызовет исключение. Хуже, если переменная с тем же именем, что и столбец таблицы, используется в операторе SQL без двоеточия. Сервер считает, что это ссылка на столбец, выполняет оператор и вызывает исключение. Нечего и говорить, что результат такой операции будет непредсказуемым.
Использование (вызов)
Выполняемая процедура вызывается оператором EXECUTE PROCEDURE. Она может возвращать не более одной выходной строки. Для выполнения хранимой процедуры в isql используйте следующий синтаксис:
EXECUTE PROCEDURE ИМЯ [(] [ аргумент [, аргумент . . . ] ] [) ] ;
Имя процедуры должно быть задано.
Правила, касающиеся аргументов, следующие:
* значения должны быть заданы для всех входных аргументов;
* если есть несколько входных аргументов, они должны отделяться друг от друга запятыми;
* каждый аргумент является константой, выражением, преобразуемым в константу или заменяемым параметром;
* переменные могут передаваться как входные аргументы только внутри модуля PSQL;
* заменяемые параметры могут передаваться только внешним операторам DSQL;
* константы и выражения, которые преобразуются в константы, являются допустимыми для любого вызова;
* выражения, которые оперируют с переменными или заменяемыми параметрами, недопустимы;
* скобки, заключающие список аргументов, необязательны.
Поскольку наша процедура DELETE_EMPLOYEE не возвращает аргументов, синтаксис ее вызова из клиентского приложения и из другой процедуры одинаков:
EXECUTE PROCEDURE DELETE_EMPLOYEE (29) ;
При этом, когда процедура вызывается из другой процедуры, входные аргументы могут быть (и обычно бывают) представлены переменными. Поскольку EXECUTE PROCEDURE является оператором DSQL, синтаксис требует, чтобы имя переменной имело префикс точку с запятой:
EXECUTE PROCEDURE DELETE_EMPLOYEE (:EMP_NUMBER);
Другая процедура ADD_EMP_PROJ получает два входных аргумента, ключ служащего и проекта соответственно. Пример вызова может быть таким:
EXECUTE PROCEDURE ADD_EMP_PROJ (32, 'MKTPR');
Заменяемые параметры используются для входных аргументов при вызове этой процедуры из клиентского приложения:
EXECUTE PROCEDURE ADD_EMP_PROJ (?, ?) ;
Если выходному параметру не было определено значение, то его значение непредсказуемо, и это может привести к ошибке, иногда достаточной для нарушения целостности данных. В процедуре следует обеспечить инициализацию всех выходных параметров значениями по умолчанию, до того как нужные значения получатся в процессе обработки и будут выданы при выполнении операторов SUSPEND и EXIT.
В процедурах выбора и в выполняемых процедурах оператор EXIT приводит к немедленному переходу к финальному оператору END без выполнения других операторов.
Что произойдет, если процедура достигнет финального оператора END, зависит от ее типа.
* В процедуре SELECT код SQLCODE будет установлен в 100 для указания того, что больше нет найденных строк, а управление перейдет вызвавшей программе.
* В выполняемой процедуре управление перейдет к вызвавшей программе с передачей ей выходных значений, если они присутствуют. Вызовы из триггеров или процедур получают выходные данные через переменные, как задано в RETURNING_VALUES. Приложение получает их в структуре записи.