Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
для студентов РУБД / Лаб раб 4 курс.doc
Скачиваний:
60
Добавлен:
21.03.2016
Размер:
635.39 Кб
Скачать

Курсоры

Простые курсоры обеспечиваются внутри сохраненных процедур и функций. Синтаксис как во внедренном SQL. Курсоры в настоящее время только для чтения, не поддерживают прокрутку и нечувствительны. Последнее означает, что сервер может или не может делать копию таблицы результата.

Курсоры должны быть объявлены перед объявлением драйверов и переменных, а условия должны быть объявлены перед объявлением курсоров и драйверов.

Пример:

CREATE PROCEDURE curdemo()

BEGIN

DECLARE done INT DEFAULT 0;

DECLARE a CHAR(16);

DECLARE b,c INT;

DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;

DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

OPEN cur1;

OPEN cur2;

REPEAT

FETCH cur1 INTO a, b;

FETCH cur2 INTO c;

IF NOT done THEN

IF b < c THEN INSERT INTO test.t3 VALUES (a,b);

ELSE INSERT INTO test.t3 VALUES (a,c);

END IF;

END IF;

UNTIL done END REPEAT;

CLOSE cur1;

CLOSE cur2;

END

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

DECLARE cursor_name

CURSOR FOR select_statement

Эта инструкция объявляет курсор. Много курсоров может быть объявлено в подпрограмме, но каждый курсор в данном блоке должен иметь уникальное имя.

Инструкция SELECTне может иметь предложениеINTO.

Инструкция OPEN

OPEN cursor_name

Эта инструкция открывает предварительно объявленный курсор.

Инструкция FETCH

FETCH cursor_name

INTO var_name [, var_name] ...

Эта инструкция выбирает следующую строку (если строка существует), используя определенный открытый курсор, и продвигает указатель курсора.

Если больше нет доступных строк, происходит условие No Data со значением SQLSTATE 02000. Чтобы обнаружить это условие, Вы можете установить драйвер для этого.

Инструкция CLOSE

CLOSE cursor_name

Эта инструкция закрывает предварительно открытый курсор. Если курсор не закрыт явно, он все равно закроется в конце составной инструкции, в которой он был объявлен.

Конструкции управления потоком данных

Инструкция IF

IF search_condition THEN statement_list

[ELSEIF search_condition

THEN statement_list] ...

[ELSE statement_list]

END IF

IFреализован как базисная условная конструкция. Если выражениеsearch_conditionистинно, соответствующий список инструкции SQL выполнен. Если парыsearch_conditionне нашлось, будет выполнен операторный список в предложенииELSE. Каждыйstatement_listсостоит из одной или большего количества инструкций.

Обратите внимание: имеется также функцияIF(), которая отличается от командыIF, описанной здесь.

Инструкция case

CASE case_value WHEN when_value

THEN statement_list

[WHEN when_value THEN statement_list] ...

[ELSE statement_list]

END CASE

Или:

CASE WHEN search_condition THEN statement_list

[WHEN search_condition THEN statement_list] ...

[ELSE statement_list]

END CASE

Инструкция CASEдля сохраненных подпрограмм осуществляет сложную условную конструкцию. Еслиsearch_conditionравно true, соответствующий список инструкций SQL выполнен. Если никакие условия не подошли, отрабатывается операторный список в предложенииELSE. Каждыйstatement_listсостоит из одной или большего количества инструкций.

Обратите внимание: синтаксис инструкцииCASE, показанной здесь для использования внутри сохраненных подпрограмм немного отличается от такового выражения в SQL. ИнструкцияCASEне может иметь предложениеELSE NULL, и она завершенаEND CASEвместоEND.