13.3. Команды управления в pl/sql
Условные операторы IF
Операторы CASE
Операторы цикла
Конструкция полувыбора IF – THEN
IF x = 0 THEN
Y:=1;
END IF;
Конструкция полного выбора IF – ELSE - THEN
BEGIN
IF x>y THEN
Max := x;
ELSE
Max := y;
END IF;
END;
Оператор CASE имеет следующий синтаксис:
CASE переменная
WHEN выражение1 THEN значение1
WHEN выражение2 THEN значение2
WHEN выражение3 THEN значение3
ELSE значение5
END;
Циклы
Имеются три типа циклов: простой цикл LOOP, цикл FOR, цикл WHILE
Цикл LOOP
LOOP
команды;
EXIT [WHEN выражение];
END LOOP;
Для выхода из цикла используется оператор EXIT
Циклы WHILE
WHILE условие LOOP
Команда1;
Команда2;
. . .
END LOOP;
Цикл FOR
FOR I IN m . . n
LOOP
Команда1;
END LOOP
Пример.
DECLARE
m NUMBER :=1;
n NUMBER := 100;
BEGIN
FOR I IN m . . n LOOP
. . .
END LOOP;
END;
Пример. Необходимо вставить числа в таблицу TABL(num) от 1 до 10, исключая числа 5 и 7.
BEGIN
FOR i IN 1 . . 10
LOOP
IF i=6 OR i=8 THEN
null;
ELSE
INSERT INTO TABL(num)
VALUES(i);
END IF
END LOOP;
END;
13.4. Команды sql в pl/sql
SELECT – команда выборки данных.
Существуют команды SELECT однострочной выборки и многострочной.
Синтаксис команды при однострочной выборки:
SELECT список_выборки
INTO {имя_переменной [, имя_переменной] . . .| имя_записи}
FROM таблица
[WHERE условие];
Пример.
Пусть у нас имеется отношение sotrud (ns, name),
Где ns – номер сотрудника, name – имя сотрудника.
SET SERVEROUTPUT ON
DECLARE
fname VARCHAR2(25);
BEGIN
SELECT name INTO fname
FROM sotrud
WHERE ns=126;
DBMS_OUTPUT.PUT_LINE(‘ Name is: ‘ || fname);
END;
Манипулирование данными в pl/sql
Внесение изменений в таблицы базы данных с помощью команд DML:
INSERT, UPDATE, DELETE, MERGE
Оператор MERGE выбирает строки из одной таблицы для изменения или вставки в другую таблицу.
13.5. Курсор в pl/sql
Для выборки из базы данных многих записей и последующей обработке их в программе вводится понятие курсора. Курсор может быть неявным или явным. При однострочной выборке, курсор обычно неявный. При многострочной выборке необходимо явно указать курсор.
Синтаксис объявления явного курсора:
CURSOR имя_курсора IS команда_SELECT;
Пример.
DECLARE
CURSOR q IS
SELECT ns, name FROM sotrud
WHERE ns=140;
Управление явным курсором производится по следующей схеме, см.рис.13.4.

Рис.13.4. Схема управления курсором
Пример. Выборка данных из курсора.
SET SERVEROUTPUT ON
DECLARE
CURSOR q IS
SELECT ns, name FROM sotrud
WHERE ns=140;
num sotrud.ns%TYPE;
lname sotrud.name%TYPE;
BEGIN
OPEN q;
FETCH q INTO num, lname;
DBMS_OUTPUT.PUT_LINE (num || ‘ ‘ || lname);
. . .
END;
Пример. Выборка данных в цикле.
SET SERVEROUTPUT ON
DECLARE
CURSOR q IS
SELECT ns, name FROM sotrud
WHERE ns=140;
num sotrud.ns%TYPE;
lname sotrud.name%TYPE;
BEGIN
OPEN q;
LOOP
FETCH q INTO num, lname;
EXIT WHEN q%NOTFOUND;
DBMS_OUTPUT.PUT_LINE (num || ‘ ‘ || lname);
END LOOP;
. . .
END;
Курсорный цикл FOR
Курсорный цикл FOR включает курсор SELECT и позволяет осуществлять выборку нескольких строк из базы данных. При этом не нужно заботиться об открытии и закрытии курсора. ORACLE сделает это самостоятельно внутри цикла. В цикле FOR объявлять курсор не требуется.
Пример.
SET SERVEROUTPUT ON
BEGIN
FOR q IN ( SELECT ns, name FROM sotrud
WHERE ns=140;
LOOP
DBMS_OUTPUT.PUT_LINE (q.ns || ‘ ‘ || q.name);
END LOOP;
END;
Здесь переменная q используется для сохранения результатов выполнения курсора.
