Иллюстрированный самоучитель по SQL для начинающих

Постоянно хранимые модули

CASE…END CASE

Существуют два вида оператора CASE: простой оператор CASE и оператор CASE с поиском. В зависимости от выполнения нескольких условий выполнение программы происходит по одному из нескольких вариантов.

Простой оператор CASE

Простой оператор CASE вычисляет одно выражение. В зависимости от его значения выполнение программы происходит одним из нескольких возможных путей. Например:

CASE vinajor
WHEN 'Computer Science'
THEN INSERT INTO geeks (StudentID, Fname, Lname)
VALUES(:sid,:sfname,:slname);
WHEN 'Sports Medicine'
THEN INSERT INTO jocks (StudentID, Fname, Lname)
VALUES(:sid, rsfname,:slname);
ELSE INSERT INTO undeclared (StudentID, Fname, Lname)
VALUES(:sid,:sfname,:slname);
END CASE

Команды предложения ELSE выполняются, если vmajor не попадает ни в одну из категорий, заданных предложениями THEN.

Внимание:
Оператор ELSE является необязательным. Однако, если он отсутствует и выражение CASE не соответствует ни одному предложению THEN, SQL генерирует исключение
.

Оператор CASE с поиском

Оператор CASE с поиском аналогичен простому оператору CASE, за исключением того, что используется несколько условных выражений, а не одно. Например:

CASE
WHEN vmajor
IN ('Computer Science', 'Electrical Engineering')
THEN INSERT INTO geeks (StudentID, Fname, Lname)
VALUES(:sid,:sfname,:slname);
WHEN vclub
IN ('Amateur Radio', 'Rocket1,'Computer')
THEN INSERT INTO geeks (StudentID, Fname, Lname)
VALUES(:sid,:sfname,:slname);
ELSE
INSERT INTO poets (StudentID, Fname, Lname)
VALUES(:sid,:sfname,:slname);
END CASE

Чтобы избежать возможности возникновения исключения, следует поместить всех студентов, которые не являются "физиками" (geeks), в таблицу poets ("лирики") – Конечно, не все "не физики" являются "лириками" – ведь есть же еще и "футболисты", не говоря уже о "химиках". Это не меняет сути дела, так как в оператор CASE всегда можно добавить еще несколько предложений WHEN.

LOOP…END LOOP

Структура LOOP позволяет многократно выполнять некоторую последовательность команд SQL. После выполнения последней команды SQL, находящейся внутри структуры LOOP…ENDLOOP, цикл передает управление первой команде цикла, и все команды цикла выполняются еще раз. Синтаксис структуры LOOP…ENDLOOP имеет следующий вид:

LOOP
SET vcount=vcount+1;
INSERT INTO asteroid (AsteroidID)
VALUES (vcount);
END LOOP

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

Необходимо отметить, что данный фрагмент кода имеет один существенный недостаток. Созданный им цикл является бесконечным. В нем нет кода окончания, следовательно, добавление в таблицу строк будет продолжаться до тех пор, пока СУБД будет располагать местом на диске. Затем система в лучшем случае сгенерирует исключение, а в худшем – просто аварийно завершит работу.

Для практического использования оператора LOOP необходимо иметь возможность выхода из цикла без возникновения исключения. Для этого имеется оператор LEAVE.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.