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

WHERE pro du ct_id = p_product_id;

— если товар существует (v_product_count =1) ,

— обновляем цену этого товара

IF v_product_count = 1 THEN

UPDATE products

SET p r ic e = p r ic e * p _ fa c to r

WHERE produ ct_id = p_product_id;

COMMIT;

END IF;

EXCEPTION

WHEN OTHERS THEN

ROLLBACK;

END update_product_price;

/

Процедура принимает два параметра - p_product_id и p _ fa c to r (явсегда

помещаю р_ в начале имени процедуры). Оба эти параметра используют

режим IN; это означает, что их значения должны быть заданы при запуске

процедуры и они не могут быть изменены в теле процедуры.

Секция объявления содержит переменную типа INTEGER по имени v_

product_count:

□ v_product_count INTEGER;

За секцией объявления следует тело процедуры, начинающееся с BEGIN.

Оператор SELECT получает количество строк из таблицы products, чей

produ ct_id равен p_product_id:

□ SELECT COUNT(*)

INTO v_product_count

FROM products

WHERE produ ct_id = p_product_id;

Знакомство с программированием на PL/SQL 375

Примечание COUNT(*) возвращает количество найденных строк.

Если товар существует в таблице, v_product_count будет установлена в 1.

Если же такой товар отсутствует, v_product_count будет установлена в 0. Если

значение переменной v_product_count равно 1 , столбец v_price будет

умножен на p_factor с использованием оператора UPDATE, и изменение будет

зафиксировано:

□ IF v_product_count = 1 THEN

UPDATE products

SET price = price * p_factor

WHERE product_id = p_producr_id;

COMMIT;

END IF;

Блок EXCEPTION выполняет ROLLBACK при возникновении исключения:

□ EXCEPTION

WHEN OTHERS THEN

ROLLBACK;

Наконец, ключевое слово END используется для обозначения конца

процедуры:

□ END update_product_price;

/

Примечание Повторение имени процедуры в конце текста не является обязательным, но у

программистов делать это считается хорошим тоном.

Вызов процедуры

Для вызова процедуры используется оператор CALL. В следующем примере

цена товара № 1 будет умножена на коэффициент 1.5, для чего будет использована

процедура update_product_price из предыдущего раздела. Приведенный

ниже запрос сначала производит выборку цены товара, чтобы

можно было затем сравнить ее с модифицированной ценой:

□ SELECT price

FROM products

WHERE product_id = 1 ;

PRICE

19.95

Следующий оператор вызывает процедуру update_product_price(), передавая

ей значения параметров 1 (значение product_id) и 1.5 (значение

коэффициента, на который должна быть умножена цена товара):

□ CALL update_product_price(1, 1.5);

Call completed.

Это выражение демонстрирует использование позиционной записи для

указания значений, передаваемых в процедуру или функцию. В позиционной

376 Глава 11

записи позиция параметров используется для назначения значений, передаваемых

в процедуру. В примере первое значение в вызове равно 1, и оно

передаётся первому параметру процедуры (p_product_id); второе значение

в вызове равно 1.5, и оно передаётся второму параметру (p_factor).

В Oracle 1 l g вы можете использовать наряду с позиционной записью также

поимённую и смешанную запись; вскоре вы ознакомитесь с этими типами

записи.

Следующий запрос снова выбирает цену товара № 1; обратите внимание,

что цена товара увеличена в 1.5 раза:

□ SELECT p r ic e

FROM products

WHERE p rodu ct_id = 1;

PRICE

29.93

В базе данных Oracle l l g вы можете передавать параметры при помощи

поимённой и смешанной записи. В поимённой записи при вызове процедуры

вы должны включить имя параметра. Например, следующее выражение

вызывает u p d a te _ p ro d u c t_ p rice () с использованием поимённой записи;

обратите внимание, что значения для параметров p _ fa c to r и р_

produ ct_id отмечены при помощи =>:

□ CALL u p d a te _ p ro d u c t_ p rice (p _ fa c to r => 1.3, p_product_id => 2);

Совет Поимённая запись упрощает ваш код для чтения и обработки, поскольку параметры

показаны явно.

В смешанной записи вы можете использовать одновременно позиционную

и поимённую запись; позиционная запись используется для первого

набора параметров, а поимённая запись - для последнего набора параметров.

Смешанная запись полезна, когда у вас есть процедуры и функции, у

которых есть как обязательные, так и необязательные параметры; позиционная

запись используется для обязательных параметров, а поимённая

запись - для необязательных параметров. Следующий пример использует

смешанную запись; обратите внимание, что позиционная запись предшествует

поимённой записи при указании значений параметров:

□ CALL update_product_price(3, p _ fa c to r => 1.7);

Получение информации о процедурах

Получить информацию о процедурах можно из представления user_