Открытие курсора
Оператор открытия курсора предназначен для связывания курсорной переменной с объектом процедурного языка, который будет заполнять поля курсора в процессе выполнения хранимой процедуры. Таким объектом может быть претранслируемый или динамический запрос, возвращающий выборку данных, или процедура, возвращающая курсор.
Синтаксис
<курсор с претранслируемым запросом> ::= OPEN <имя курсорной переменной> [AS "имя курсора"] FOR <запрос> [{,|USING} <параметр> [, …]];
<курсор с динамическим запросом>::= OPEN <имя курсорной переменной> [AS "имя курсора"] FOR DIRECT <выражение символьного типа> [{,|USING} <параметр> [, …]];
<курсор с процедурой, возвращающей курсор>::= OPEN <имя курсорной переменной> [AS "имя курсора"] FOR CALL <имя процедуры>(<список параметров>);
Описание
Курсор представляет собой выборку, содержащую набор значений определенной структуры (состоящую из полей). Значения полей доступны через курсорную переменную, а навигация по выборке осуществляется оператором FETCH.
Формат <запроса> рассмотрен в подразделе Выполнение запроса. Для открытия курсора допустим только SELECT-запрос.
Во втором случае предполагается вызов процедуры, возвращающей курсор. Синтаксис вызова такой же, как в операторе CALL
, за исключением того, что здесь нельзя использовать фразу INTO
.
Если указана фраза AS
, открывается поименованный курсор. Курсор необходимо именовать в случае, когда будут подаваться запросы с условием WHERE CURRENT
. Имя курсора заключается в кавычки и должно быть допустимо с точки зрения СУБД ЛИНТЕР.
После открытия курсора значения первой записи выборки уже доступны через курсорную переменную.
Если количество и/или типы полей курсора не соответствуют структуре курсорной переменной, то при выполнении OPEN
происходит исключение BADCURSOR
.
Примеры
-
курсор с претранслируемым запросом
create or replace procedure tst(in id int) result cursor( c char(20) ) declare var b typeof(result); code open b for "select make from auto where personid=?;", id; return b; end;
-
курсор с динамическим запросом
create or replace procedure tst(in id int) result cursor( c char(20) ) declare var b typeof(result); code open b for direct "select make from auto where personid=" + itoa(id) + ";"; return b; end;
-
курсор с процедурой, возвращающей курсор
open b as "cursor_b" for call prc_retcur("auto");