Конструкция SELECT ... INTO
Конструкция SELECT ... INTO
Конструкция SELECT ... INTO обычна для PSQL. Когда из таблицы запрашиваются значения, предложение INTO позволяет сохранить их в переменных - в локальных переменных или в выходных аргументах. В этой процедуре нет выходных параметров. Мы используем переменную ANY SALES, которую мы объявили и инициализировали в начале тела процедуры для хранения счетчика записей продаж. Обратите внимание на префикс двоеточия (:) у переменной ANY_SALES. Мы рассмотрим это, когда процедура будет готова.
SELECT count(po_number) FROM sales
WHERE sales_rep = :emp_num
INTO :any_sales;
IF (any_sales > 0) THEN
EXCEPTION reassign_sales;
В случае если такие записи заказов будут найдены, процедура аккуратно завершается на операторе EXCEPTION, который при отсутствии обработчика исключений передает выполнение прямо на самый последний оператор END процедуры. В этих условиях процедура завершается, а сообщение об исключении передается вызвавшей программе[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 без двоеточия. Сервер считает, что это ссылка на столбец, выполняет оператор и вызывает исключение. Нечего и говорить, что результат такой операции будет непредсказуемым.