|
Страница 1 из 5 Курсор - это указатель на зарезервированный участок памяти в SGA, где обрабатывается SQL (SELECT) или DML (UPDATE/INSERT/DELETE) предложение. SGA (Системная Глобальная Область) большой участок оперативной памяти, зарезервированный операционной системой, который используется для работы Oracle. В SGA (между прочим) находятся разделяемый пул (shared memory pool) и пул частной памяти (private memory pool), где выполняются PL/SQL-программы. Когда ваш код скомпилирован и загружен в память для выполнения, определение курсора загружается в разделяемый пул: текст курсора и разобранный код. Под термином "совместно используемый" подразумевается то, что только одна копия существует в памяти и означает, если Вы и Я оба вводят один и тот же идентичный запрос (запросы совпадают по-символьно), мы используем уже разобранный курсор. Oracle знает, что ваш курсор и мой - идентичны при сравнении текстовой версии курсора. И в этом случае Oracle может использовать тот курсор, который уже в памяти.
Когда Я выполняю свой курсор, информация, необходимая для обработки, сохраняется в пуле частной памяти. В этом случае Oracle позволяет многократное использование одного и того же курсора. РИС.1. Типы Курсоров Существует три основных типов курсоров: * Неявный, * Явный и * Курсорные циклы FOR. Неявные Курсоры Неявный курсор управляется автоматически, прозрачно для Вас. В процессе выполнения, курсор открывается, из него выбираются данные и закрывается, все за один шаг.Неявные курсоры используются только в том случае, если надо возвратить единственную строку из таблицы. SELECT addr1, addr2, city, state, zip5 INTO v_addr1, v_addr2, v_city, v_state, v_zip5 FROM addresses WHERE ... -- извлечь по уникальному ключу -- (exact match on unique key) Если неявный курсор должен возвратить более, чем одну строку, срабатывает исключение (TOO_MANY_ROWS). Дело в том, что Вы можете выбирать (SELECT INTO) только в скалярные переменные (имеющие только единственное значение). Если неявный курсор вообще не возвращает строк, срабатывает исключение (NO_DATA_FOUND). Всегда используйте неявный курсор вместе с его своим собственным обработчиком исключений. Типичные исключения, которые могут возникать при работе с курсором: Exception Name ORACLE Error SQLCODE Value ---------------------------------------------------------- CURSOR_ALREADY_OPEN ORA-06511 -6511 DUP_VAL_ON_INDEX ORA-00001 -1 INVALID_CURSOR ORA-01001 -1001 INVALID_NUMBER ORA-01722 -1722 LOGIN_DENIED ORA-01017 -1017 NO_DATA_FOUND ORA-01403 +100 NOT_LOGGED_ON ORA-01012 -1012 PROGRAM_ERROR ORA-06501 -6501 STORAGE_ERROR ORA-06500 -6500 TIMEOUT_ON_RESOURCE ORA-00051 -51 TOO_MANY_ROWS ORA-01422 -1422 TRANSACTION_BACKED_OUT ORA-00061 -61 VALUE_ERROR ORA-06502 -6502 ZERO_DIVIDE OAR-01476 -1476 Если объявлена переменная типа record, поля которой точно совпадают с данными, запрашиваемыми в операторе SELECT, то можно использовать конструкцию SELECT INTO.
|