Получение информации о хранимых процедурах и функциях.
Ин-
формацию о процедурах и функциях можно получить из представления
словаря данных USER_OBJECTS, например, следующей командой:
SELECT * FROM USER_OBJECTS;
П р и м е р ы
1.
Создать хранимую процедуру, увеличивающую стоимость указан-
ной книги в таблице BOOKS на 10 %. Параметр: код книги.
Вариант 1.
CREATE OR REPLACE PROCEDURE INCREASE
(CODE_BOOK BOOKS.CODE_BOOK%TYPE) AS
Q NUMBER(1) := 0;
BEGIN
SELECT COUNT(*) INTO Q FROM BOOKS
WHERE BOOKS.CODE_BOOK = INCREASE.CODE_BOOK;
IF Q <> 0 THEN
UPDATE BOOKS SET PRICE = PRICE + PRICE*0.1
WHERE BOOKS.CODE_BOOK = INCREASE.CODE_BOOK;
ELSE
RAISE_APPLICATION_ERROR(-20105, ‘В таблице BOOKS
отсутствует книга с указанным кодом’);
END IF;
END INCREASE;
Выполнение процедуры INCREASE (вариант 1) реализуется операто-
ром
EXECUTE INCREASE (1);
174
Вариант 2.
CREATE OR REPLACE PROCEDURE INCREASE
(CODE_BOOK BOOKS.CODE_BOOK%TYPE) AS
BEGIN
UPDATE BOOKS SET PRICE = PRICE*1.1
WHERE BOOKS.CODE_BOOK = INCREASE.CODE_BOOK;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20105, ‘В таблице BOOKS
отсутствует книга с указанным кодом’);
END IF;
END INCREASE;
Выполнение процедуры INCREASE (вариант 2) реализуется операто-
ром
EXECUTE INCREASE (1);
2.
Создать хранимую процедуру, которая при поступлении книг к
продавцу либо добавляет указанное количество к количеству уже имею-
щихся у продавца таких же книг, обновляя соответствующую запись в
таблице BOOKS_DELIVERY, либо вставляет новую запись в таблицу
BOOKS_DELIVERY, если у продавца книг такого наименования нет.
Параметры: код книги, количество единиц, фамилия продавца.
Создание процедуры:
CREATE OR REPLACE PROCEDURE ADD_BOOKS
(CODE_BOOK NUMBER, QUANTITY NUMBER,
SALESMAN VARCHAR2) IS
Q NUMBER(5) := 0;
BEGIN
SELECT COUNT(*) INTO Q FROM BOOKS_DELIVERY
WHERE
BOOKS_DELIVERY.CODE_BOOK = ADD_BOOKS.CODE_BOOK
AND
BOOKS_DELIVERY.SALESMAN = ADD_BOOKS.SALESMAN;
IF Q <> 0 THEN
UPDATE BOOKS_DELIVERY SET
QUANTITY = QUANTITY + ADD_BOOKS.QUANTITY
WHERE
BOOKS_DELIVERY.CODE_BOOK =
ADD_BOOKS.CODE_BOOK
AND
175
BOOKS_DELIVERY.SALESMAN = ADD_BOOKS.SALESMAN;
ELSE
INSERT INTO BOOKS_DELIVERY VALUES
(CODE_OP.NEXTVAL,
ADD_BOOKS.CODE_BOOK, ADD_BOOKS.SALESMAN,
ADD_BOOKS.QUANTITY, SYSDATE);
END IF;
END ADD_BOOKS;
Выполнение процедуры ADD_BOOKS реализуется следующими опе-
раторами:
EXECUTE ADD_BOOKS(1, 10, 'Иванов И. И.');
EXECUTE ADD_BOOKS(5, 10, 'Иванов И. И.');
При первом вызове процедуры осуществляется добавление 10 книг к
тем, что уже имеются у указанного продавца. При втором вызове в таб-
лицу BOOKS_DELIVERY вставляется новая запись.
3.
Создать хранимую функцию, которая проверяет, входит ли для
указанного продавца общее количество имеющихся у него книг в опре-
деленный диапазон, и если нет, то выдает соответствующее сообщение.
Параметр: фамилия продавца. Минимальное и максимальное значения
для проверки устанавливаются в теле функции с помощью переменных
MIN_QUANTITY и MAX_QUANTITY.
Создание функции:
CREATE OR REPLACE FUNCTION TEST_B
(SALESMAN VARCHAR2)
RETURN BOOLEAN IS
MIN_QUANTITY NUMBER(5) :=10;
MAX_QUANTITY NUMBER(5) := 100;
Q NUMBER(5);
BEGIN
SELECT SUM(QUANTITY) INTO Q FROM
BOOKS_DELIVERY WHERE
BOOKS_DELIVERY.SALESMAN = TEST_B.SALESMAN;
RETURN (Q >= MIN_QUANTITY AND Q <= MAX_QUANTITY);
END TEST_B;
Вызов функции TEST_B осуществляется с помощью тестирующей
программы, приведенной ниже.
DECLARE
ADD_SALESMAN VARCHAR2(20);
176
ADD_QUANTITY NUMBER(5);
ADD_CODE_BOOK NUMBER(5);
BEGIN
ADD_SALESMAN := 'Иванов И. И.';
ADD_QUANTITY := 20;
ADD_CODE_BOOK := 3;
IF TEST_B(ADD_SALESMAN) THEN
UPDATE BOOKS_DELIVERY SET
QUANTITY = QUANTITY + ADD_QUANTITY
WHERE
BOOKS_DELIVERY.CODE_BOOK = ADD_CODE_BOOK
AND BOOKS_DELIVERY.SALESMAN =
ADD_SALESMAN;
END IF;
END;
Программа
добавляет
указанное
количество
(переменная
ADD_QUANTITY)
книг
указанному
продавцу
(переменная
ADD_SALESMAN), если общее количество имеющихся у него книг не
превосходит 100 и не менее 10.
Достарыңызбен бөлісу: |