1 : ’
□ BEGIN
INSERT INTO customers (
customer_id, first_v_name, last_v_name
) VALUES (
1 , 'Greg’ , ‘ Green’
);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
DBMS_0UTPUT.PUT_LINE(‘ Duplicate value on an index’ ) ’
END
/
Duplicate value on an index
Исключение INVALID.NUMBER
Исключение INVALID_NUMBER создаётся при попытке конвертировать в число
недопустимую символьную строку. В следующем примере показана попытка
конвертировать символьную строку 123Х в число и использовать
это число в операторе INSERT, в результате чего возникает исключение
INVALID_NUMBER, так как 123Х не является числом:
□ BEGIN
INSERT INTO customers (
customer_id, first_v_name, last_v_name
372 Глава 11
) VALUES (
‘ 123Х ’ , ‘ Greg’ , ‘ Green’
); EXCEPTION
WHEN INVALID_NUMBER THEN
DBMS_OUTPUT.PUT_LINE(‘ Conversion of string to number fa ile d ');
END;
/
Conversion of string to number failed
Исключение OTHERS
Исключение OTHERS можно использовать для обработки всех исключительных
ситуаций:
□ BEGIN
DBMS_OUTPUT.PUT_LINE(1 / 0);
EXCEPTION
WHEN OTHERS THEN
DBMS_0UTPUT.PUT_LINE(‘ An exception occurred’ );
END; . -
/
An exception occurred
Поскольку OTHERS обрабатывает все исключительные ситуации, ее следует
помещать в самый конец списка конкретных обрабатываемых исключений
в блоке EXCEPTION. При попытке поместить ее в какое-либо другое
место списка база данных выдаст ошибку PLS-00370:
□ SQL> BEGIN
2 DBMS_0UTPUT.PUT_LINE(1 / 0);
3 EXCEPTION
4 WHEN OTHERS THEN
5 DBMS_0UTPUT.PUT_LINE(‘ An exception occurred’ );
6 WHEN ZER0_DIVIDE THEN
7 DBMS_OUTPUT.PUT_LINE(‘ D i v i d i n g by z e r o ’ );
8 END;
9 /
WHEN OTHERS THEN
•k
ERROR at line 4:
(ОШИБКА В СТРОКЕ 4:
0RA-06550: line 4, column 3:
(0RA-06550: строка 4, столбец 3:
PLS-00370: OTHERS handler must be last among the exception
(PLS-00370: Обработчик OTHERS должен быть последним среди обработчиков
исключительных
handlers of a block
(ситуаций блока
0RA-06550: line 0, column 0:
(ORA—06550: строка 0, столбец 0:
PL/SQL: Compilation unit analysis terminated
(PL/SQL: Анализ блоком компиляции завершен.)
Знакомство с программированием на PL/SQL 373
Процедуры
Процедура содержит группу операторов SQL и PL/SQL. Процедуры позволяют
централизовать бизнес-логику приложения базы данных и могут
быть использованы любой программой, которая может получить доступ к
базе данных.
В этом разделе вы узнаете как:
■ Создать процедуру.
■ Вызвать процедуру.
■ Получить информацию о процедурах.
■ Удалить процедуру.
■ Просмотреть ошибки в процедуре.
Создание процедуры
Для создания процедуры используется оператор CREATE PROCEDURE. Упрощенный
синтаксис оператора CREATE PROCEDURE выглядит следующим образом:
- -
□ CREATE [OR REPLACE] PROCEDURE имя_процедуры
[ (имя_параметра [IN | OUT | IN OUT ] тип [, . . . ] ) ]
{ IS | AS}
BEGIN
тело_процедуры
END имя_процедуры;
где
■ OR REPLACE определяет, что процедура должна заменить уже существующую
процедуру;
■ имя_процедуры определяет имя процедуры;
■ имя_параметра определяет имя параметра, передаваемого в процедуру.
Процедуре можно передать несколько параметров;
■ IN | OUT | IN OUT определяет режим параметров. Для каждого параметра
можно выбрать один из следующих режимов;
■ IN является режимом по умолчанию для параметра. Этот режим
определяет так называемый входной параметр, т. е. такой параметр,
который к моменту выполнения уже имеет значение, и это
значение не может измениться в теле процедуры,
■ OUT используется для параметров, значения которых устанавливаются
только в теле процедуры,
■ IN OUT используется для параметров, которые могут иметь значение
к моменту вызова процедуры, но эти значения могут быть изменены
в теле процедуры;
■ тип определяет тип параметра;
■ тело_процедуры содержит программный код процедуры.
374 Глава 11
Следующий оператор определяетпроцедурупоимениирс!а1е_ргос1ис1:_у_
p r ic e ( ). Эта процедура (а также весь остальной код PL/SQL, показанный в
этой главе) была создана при выполнении сценария store_schema.sql. Процедура
u p d a te_ p ro d u ct_ v_ p rice () умножает цену товара на коэффициент -
значения идентификатора товара и коэффициента передаются в процедуру
как параметры. Если товар существует, процедура обновляет цену товара,
умножая ее на предлагаемый коэффициент и сохраняет изменение.
□ CREATE PROCEDURE update_product_v_price(
p_product_id IN products.product_id%TYPE,
p _ fa c to r IN NUMBER
) AS
v_product_count in re g e r;
BEGIN
(— подсчитайте количество товаров с
(— заданным v_produ ct_id (он должен быть в единственном числе, если то вар
существует)
SELECT COUNT(*)
INTO v_product_count
FROM products - -