Выбрать главу

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 - -