Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы данных Шехтман.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
3 Мб
Скачать
☆

In pr double precision)

RETURNS CHAR(6)

DECLARE p DOUBLE PRECISION;

BEGIN

SET p = (SELECT AVG(PRICE) FROM SUPPLIES

WHERE CODEG=G);

IF p < PR THEN RETURN ‘Дорого’

ELSE RETURN ‘Дешево’

END IF;

END;

Циклы

LOOP … END LOOP;

LEAVE <имя цикла>; - выход из цикла, где <имя цикла> - метка цикла.

Пример:

Look1: LOOP

…

LEAVE Loop1

…

END LOOP;

Другие формы цикла:

WHILE <условие> DO <операторы> END WHILE;

REPEAT <операторы> UNTIL <условие> END REPEAT;

Операторы SQL типа SELECT-FROM-WHERE в “чистом виде" недопустимы в языке загружаемых процедур. Однако, имеется несколько других способов использовать запросы на выборку данных.

      1. Запросы на выборку данных, возвращающие единственную строку, могут использоваться как выражения в операторах присваимвания.

      2. Запрос на выборку, возвращающий единственную строку, может быть записан в форме SELECT … INTO

      3. Курсоры

Пример - запрос в присваивании:

Пусть p – локальная переменная в загружаемой процедуре, тогда чтобы узнать максимальную цену покупки бананов (допустим, что код этого товара 101), можно написать

P = (SELECT MAX(PRICE) FROM SUPPLIES WHERE CODEG=101)

Пример – SELECT … INTO:

В описанном выше случае можно поступить и иначе

SELECT MAX(PRICE) INTO P FROM SUPPLIES WHERE CODEG=101

Курсоры позволяют работать с результатом выборки, состоящим более чем из одной строки.

Объявление курсора:

DECLARE CURSOR <имя> FOR <запрос>;

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

OPEN <имя>;

В результате запрос, связанный с курсором, выполняется, и курсор указывает на первую запись отношения-результата.

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

CLOSE <имя>;

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

FETCH FROM <имя> INTO f1, f2, …, fn;

fi – переменные, в которые записываются значения атрибутов строки, извлеченной в результате запроса, связанного с курсором. После этого указатель записей в курсоре устанавливается на следующую запись.

Обычно для того, чтобы воспользоваться курсором, в загружаемой процедуре следует создать цикл, в который будет входить оператор FETCH, после которого надо предпринять какие то действия с результатом считывания значений атрибутов в локальные переменные. При этом надо позаботиться о том, чтобы выйти из цикла, когда будут обработаны все записи курсора.

В результате выполнения каждого оператора SQL формируется код завершения. Например, нормальное завершение формирует 0. Если больше нет строк в курсоре, формируется код 2000 (ситуация EOF). Код завершения можно узнать, прочитав глобальную переменную SQLSTATE.

Пример: назначим товарам, относящимся к типу овощей НДС равный 10%, а фруктам – 20%.

CREATE PROCEDURE SETNDS( )

DECLARE EOF CONDITION FOR SQLSTATE 2000;

DECLARE c INTEGER;

DECLARE n INTEGER;

DECLARE t CHAR(5);

DECLARE CURSOR c FOR

(SELECT CODE, NDS, TIP FROM GOODS

WHERE TIP IN (‘ОВОЩ’, ‘ФРУКТ’);

BEGIN

OPEN c;

Cl: LOOP

FETCH c INTO c, n, t