Опубликован: 02.08.2007 | Уровень: специалист | Доступ: платный
Лекция 12:

Разработка серверного кода

Курсоры PL/SQL

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

Рассмотрим пример доступа к информации, которая хранится в базе данных, с использованием курсоров.

Пусть в базе данных есть таблица базы данных с именем T01, такая, как показана ниже.

A1 number 1 2 3
A2 varchar2(5) abc cba bca
A3 char(1) A B C

Опишем курсор для доступа к данным таблицы Т01.

CURSOR cur01 IS SELECT * FROM T01;

Работа с курсором выполняется по следующему алгоритму:

  1. Открываем курсор:
    OPEN cur01;
  2. Выбираем данные из курсора в набор совместимых по типу переменных командой FETCH:
    FETCH cur01 INTO x1,x2,x3;
  3. Обрабатываем полученные данные.
  4. Выполняем команду FETCH для получения данных из следующей строки результирующей таблицы запроса.

И т.д.

В PL/SQL для курсоров предусмотрено несколько методов. Метод %NOTFOUND возвращает булевское истинное значение, если выборка в курсор пуста. Метод %FOUND возвращает булевское истинное значение, если выборка в курсор непуста. После открытия курсора до первой команды FETCH значения, возвращаемые этими методами, равны NULL. Метод %ROWCOUNT возвращает число строк в выборке после открытия курсора.

Предопределенный в PL/SQL метод %TYPE позволяет определить тип переменной как совпадающий с типом переменной таблицы.

PL/SQL поддерживает тип данных RECORD, который позволяет создать объект, соответствующий строке таблицы, как показано в примере ниже.

DECLARE TYPE t01_rec_type IS RECORD
( x1 t01.A1%TYPE,
x2 t01.A2%TYPE,
x3 t01.A3%TYPE);
t01_rec t01_rec_type;
…
FETCH cur1 INTO t01_rec;
DBMS_OUTPUT.PUT_LINE (cur1%ROWCOUNT||' '||t01_rec.x2);
ѕ.

Обработка исключительных ситуаций в PL/SQL

Исключительная ситуация - это возникновение предопределенного и описанного события в системе. Например, ошибки преобразования типов переменных или переполнения при делении на нуль. Пример некоторых предопределенных ситуаций, распознаваемых в PL/SQL, приведен в таблице 12.1 ниже. Для получения полного списка таких ситуаций следует обратиться к документации по PL/SQL.

Таблица 12.1. Описание некоторых исключительных ситуаций
LOGIN_DENID Неуспешное подключение к серверу
NOT_LOGGED_ON Попытка выполнить действие без подключения к серверу
INVALID_CURSOR Ссылка на недопустимый курсор или недопустимая операция с курсором
NO_DATA_FOUND Не найдены данные, соответствующие команде SELECT INTO
DUP_VAL_ON_INDEX Попытка вставить дубликат значения в колонку с ограничением на уникальное значение
VALUE_ERROR Арифметическая ошибка, ошибка усечения или преобразования
Александра Каева
Александра Каева
Михаил Забелкин
Михаил Забелкин
Евгений Вершинин
Евгений Вершинин
Россия, Нижний Новгород, Нижегородский государственный технический университет, 2008
Aleksandr Arshinskyi
Aleksandr Arshinskyi
Россия