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_