Опубликован: 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 Арифметическая ошибка, ошибка усечения или преобразования
Александра Каева
Александра Каева
Михаил Забелкин
Михаил Забелкин
Obaev Yrza
Obaev Yrza
Россия, Омская область
Раиса Лукьяненко
Раиса Лукьяненко
Россия, г. Москва

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
14.7695104885984watchdog( )../bootstrap.inc:0
24.7698104888488module_invoke( )../bootstrap.inc:967
34.7698104890344call_user_func_array ( )../module.inc:462
44.7699104890680devel_watchdog( )../module.inc:462
54.7700104891528decode_entities( )../devel.module:382
64.7700104893448drupal_error_handler( )../devel.module:340
74.7700104897072watchdog( )../common.inc:663
84.7700104899176module_invoke( )../bootstrap.inc:967
94.7701104901032call_user_func_array ( )../module.inc:462
104.7701104901368devel_watchdog( )../module.inc:462
114.7701104902064decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
14.7695104885984watchdog( )../bootstrap.inc:0
24.7698104888488module_invoke( )../bootstrap.inc:967
34.7698104890344call_user_func_array ( )../module.inc:462
44.7699104890680devel_watchdog( )../module.inc:462
54.7700104891528decode_entities( )../devel.module:382
64.7700104893448drupal_error_handler( )../devel.module:340
74.7700104897072watchdog( )../common.inc:663
84.7700104899176module_invoke( )../bootstrap.inc:967
94.7701104901032call_user_func_array ( )../module.inc:462
104.7701104901368devel_watchdog( )../module.inc:462
114.7701104902064decode_entities( )../devel.module:382

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
14.7695104885984watchdog( )../bootstrap.inc:0
24.7698104888488module_invoke( )../bootstrap.inc:967
34.7698104890344call_user_func_array ( )../module.inc:462
44.7699104890680devel_watchdog( )../module.inc:462
54.7700104891528decode_entities( )../devel.module:382
64.7708104893640drupal_error_handler( )../devel.module:340
74.7709104897328watchdog( )../common.inc:663
84.7709104899432module_invoke( )../bootstrap.inc:967
94.7709104901288call_user_func_array ( )../module.inc:462
104.7709104901624devel_watchdog( )../module.inc:462
114.7709104902400decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
14.7695104885984watchdog( )../bootstrap.inc:0
24.7698104888488module_invoke( )../bootstrap.inc:967
34.7698104890344call_user_func_array ( )../module.inc:462
44.7699104890680devel_watchdog( )../module.inc:462
54.7700104891528decode_entities( )../devel.module:382
64.7708104893640drupal_error_handler( )../devel.module:340
74.7709104897328watchdog( )../common.inc:663
84.7709104899432module_invoke( )../bootstrap.inc:967
94.7709104901288call_user_func_array ( )../module.inc:462
104.7709104901624devel_watchdog( )../module.inc:462
114.7709104902400decode_entities( )../devel.module:382

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
14.7714104886528watchdog( )../bootstrap.inc:0
24.7714104888632module_invoke( )../bootstrap.inc:967
34.7714104890488call_user_func_array ( )../module.inc:462
44.7714104890824devel_watchdog( )../module.inc:462
54.7715104891528decode_entities( )../devel.module:382
64.7715104893448drupal_error_handler( )../devel.module:340
74.7715104897056watchdog( )../common.inc:663
84.7715104899160module_invoke( )../bootstrap.inc:967
94.7715104901016call_user_func_array ( )../module.inc:462
104.7715104901352devel_watchdog( )../module.inc:462
114.7716104902048decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
14.7714104886528watchdog( )../bootstrap.inc:0
24.7714104888632module_invoke( )../bootstrap.inc:967
34.7714104890488call_user_func_array ( )../module.inc:462
44.7714104890824devel_watchdog( )../module.inc:462
54.7715104891528decode_entities( )../devel.module:382
64.7715104893448drupal_error_handler( )../devel.module:340
74.7715104897056watchdog( )../common.inc:663
84.7715104899160module_invoke( )../bootstrap.inc:967
94.7715104901016call_user_func_array ( )../module.inc:462
104.7715104901352devel_watchdog( )../module.inc:462
114.7716104902048decode_entities( )../devel.module:382

( ! ) Warning: include_once(./includes/unicode.entities.inc) [<a href='function.include-once'>function.include-once</a>]: failed to open stream: No such file or directory in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
14.7714104886528watchdog( )../bootstrap.inc:0
24.7714104888632module_invoke( )../bootstrap.inc:967
34.7714104890488call_user_func_array ( )../module.inc:462
44.7714104890824devel_watchdog( )../module.inc:462
54.7715104891528decode_entities( )../devel.module:382
64.7720104893640drupal_error_handler( )../devel.module:340
74.7720104897328watchdog( )../common.inc:663
84.7720104899432module_invoke( )../bootstrap.inc:967
94.7720104901288call_user_func_array ( )../module.inc:462
104.7721104901624devel_watchdog( )../module.inc:462
114.7721104902400decode_entities( )../devel.module:382

( ! ) Warning: include_once() [<a href='function.include'>function.include</a>]: Failed opening './includes/unicode.entities.inc' for inclusion (include_path='.:/usr/local/zend/var/libraries/Zend_Framework_1/default/library:/usr/local/zend/share/pear') in /.2/var_www_new.intuit.ru/htdocs/includes/unicode.inc on line 340
Call Stack
#TimeMemoryFunctionLocation
14.7714104886528watchdog( )../bootstrap.inc:0
24.7714104888632module_invoke( )../bootstrap.inc:967
34.7714104890488call_user_func_array ( )../module.inc:462
44.7714104890824devel_watchdog( )../module.inc:462
54.7715104891528decode_entities( )../devel.module:382
64.7720104893640drupal_error_handler( )../devel.module:340
74.7720104897328watchdog( )../common.inc:663
84.7720104899432module_invoke( )../bootstrap.inc:967
94.7720104901288call_user_func_array ( )../module.inc:462
104.7721104901624devel_watchdog( )../module.inc:462
114.7721104902400decode_entities( )../devel.module:382