Конспект лекций по дисциплине «Сетевые базы данных», страница 25

FETCH c_sal  INTO v_sname, v_comm;

Теперь данные, хранящиеся в первой выбранной из БД строке, перенесены в переменные PL/SQL v_sname, и v_comm., и эти переменные можно использовать в вычислениях, операторах IF … THEN … ELSE и т.п. Когда потребуется выбрать следующую строку, нужно снова выдать оператор FETCH. В завершение работы с курсором его закрывают командой CLOSE:

CLOSE c_sal;

Приведем пример программы, выбирающей с помощью курсора две сроки данных и выводящих их содержимое на экран.

DECLARE

CURSOR c_sal IS

SELECT sname, comm  FROM sal  WHERE city = ‘London’;

v_sname sal.sname%TYPE;

v_comm  sal.comm%TYPE;

BEGIN

FETCH c_sal  INTO v_sname, v_comm;

DBMS_OUTPUT.PUT_LINE(‘sname=’|| sname’ v_comm=’|| v_comm);

FETCH c_sal  INTO v_sname, v_comm;

DBMS_OUTPUT.PUT_LINE(‘sname=’|| sname’ v_comm=’|| v_comm);

END;

/

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

DECLARE

CURSOR c_sal IS

SELECT sname, comm  FROM sal  WHERE city = ‘London’;

v_sname sal.sname%TYPE;

v_comm  sal.comm%TYPE;

BEGIN

FOR i IN 1..2 LOOP

FETCH c_sal  INTO v_sname, v_comm;

DBMS_OUTPUT.PUT_LINE(‘sname=’|| sname’ v_comm=’|| v_comm);

END LOOP;

END;

/

Обратите внимание, что переменную цикла i в разделе DECLARE определять не требуется ­– она оператором FOR определяется автоматически.

8.2.2. Курсорные атрибуты

Для анализа необходимости и успешности выполнения этого этапа существуют четыре встроенные переменные:

%ISOPEN

%FOUND

%NOTFOUND

%ROWCOUNT

Первые три атрибута являются булевскими и могут принимать значения TRUE, FALSE или NULL. Атрибут %ISOPEN показывает, открыт курсор или нет. Атрибут %FOUND показывает, прочитана ли строка из курсора после выполнения команды FETCH. Если %FOUND имеет значение FALSE, то строка не прочитана, и это означает, что в курсоре строк больше нет (все уже выбрано или вообще не было ни одной строки). Атрибут %NOTFOUND является противоположным по смыслу атрибуту %FOUND и введен для удобства.

Атрибут %ROWCOUNT является целочисленным – это счетчик количества прочитанных строк из курсора.

Примеры применения атрибутов показаны в разделе 8.2.3.

8.2.3. Параметрыкурсора

Курсоры могут иметь параметры, что придает большую гибкость их применению. Параметры должны быть скалярными величинами. В следующем примере показано использование такого курсора.

DECLARE

  CURSOR c_cust(p_city VARCHAR2) IS

    SELECT * FROM cust WHERE city=p_city;

  v_cust c_cust%ROWTYPE;

  v_city c_cust%TYPE;

BEGIN

  v_city := 'London';

  OPEN c_cust(v_city);

  LOOP

    FETCH c_cust INTO v_cust;

    EXIT WHEN (c_cust%NOTFOUND);

    DBMS_OUTPUT.PUT_LINE(v_cust.cname||' has '||v_cust.rating);

  END LOOP;

  IF (c_cust%ISOPEN) THEN  CLOSE c_cust;

END;

/

Обратите внимание на то, что при задании типа параметра не указывается размер.

Поскольку курсоры предназначены для работы с запросами, возвращающими множество строк, они обрабатываются в программе почти всегда с помощью циклов. В предыдущем примере продемонстрировано использование простого цикла LOOP. Для упрощения операций установки и обработки курсоров в программах PL/SQL можно использовать специальный курсорный цикл FOR

8.2.4. Курсорный цикл FOR

Курсорный цикл FOR автоматически объявляет переменную или запись, куда можно будет считывать строки курсора. В нем также автоматически открывается курсор, а по завершении цикла курсор закрывается. Такой цикл будет пройден столько раз, сколько строк имеется в запросе, определенном в курсоре. В блоке PL/SQL данный цикл может быть определен следующим образом: