Постоянно хранимые модули
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.