В типичном случае курсорная переменная открывается на сервере и затем передается клиентской программе с помощью переменной привязки. В обязанности клиентской программы входит выделение памяти для переменной. В зависимости от языка, на котором написана программа клиентской стороны, курсорная переменная размещается по-разному. В этом разделе приводятся примеры размещения для клиента Рго*С. Курсорные переменные могут использоваться также в клиентских программах OCI и JDBC. Дополнительная информация о применении курсорных переменных в этих средах содержится в документации Oracle.
Выделение памяти в Рго*С Чтобы выделить память при использовании прекомпилятора Рго*С, необходимо объявить переменную типа SQL_CURSOR. Затем она размещается с помощью команды EXEC SQL ALLOCATE. Например, следующий фрагмент Рго*С объявляет и размещает курсорную переменную:
Базовая курсорная переменная является неограниченной, так как не имеет связанного возвращаемого типа.
Выделение памяти на серверной стороне
Курсорные переменные могут также полностью использоваться на сервере в рамках PL/SQL. В этом случае переменная автоматически размещается по мере необходимости, так же как и другие типы данных. Когда переменная выходит из области действия и больше не использует память, память освобождается. Курсорные переменные нельзя объявлять в модулях.
Открытие курсорной переменной для запроса
Для связи курсорной переменной с определенным оператором SELECT используется расширенный синтаксис оператора OPEN, позволяющий указать требуемый запрос:
OPEN FOR
где — это ранее объявленная курсорная переменная,
,а onepamop_select— требуемый запрос. Если курсорная переменная ограничена, список выбора должен соответствовать типу, возвращаемому курсором. Иначе выдается сообщение об ошибке:
то будет сообщение об ошибке так как список выбо-
ра запроса не соответствует типу, возвращаемому этой курсорной переменной.
Оператор OPEN...FOR, в принципе, аналогичен оператору OPEN: анализируются переменные привязки и определяется активный набор. После выполнения OPEN...FOR можно считывать информацию из курсорной переменной. Считывание может производиться либо на сервере с помощью оператора FETCH (также, как для обычного курсора), либо на клиенте.
Внимание
Запрос, используемый в OPEN FOR, должен быть жестко закодирован в программе — он не может содержаться в переменной. Это ограничение снимается в Oracle8 посредством встроенного динамического SQL (см. главу 12.)
Закрытие курсорных переменных
На сервере курсорные переменные закрываются точно так же, как статические курсоры, — при помощи оператора CLOSE. При этом освобождаются ресурсы, используемые запросом, однако память, отведенная для
хранения самой курсорной переменной, освобождается не всегда, а только когда переменная выходит из области своего действия. Запрещается повторно закрывать ранее закрытые курсоры и курсорные переменные.
На клиенте курсорные переменные закрываются, как и остальные курсоры, с помощью любого подходящего механизма.
< Предыдущая | Следующая > |
---|