Простая выборка
Назначение
Последовательная выборка записей из курсора (статического или динамического).
Синтаксис
< простая выборка >::= EXEC SQL [FOR :< число выполнений > ] FETCH {< имя курсора > | :< имя курсорной переменной >} [< положение курсора >] {USING | INTO} {< список переменных > | USING DESCRIPTOR < имя дескриптора >}; < положение курсора >::= NEXT| PRIOR | FIRST | LAST | {[ABSOLUTE | RELATIVE] :< переменная >}
Описание
-
Конструкция
FOR
задает число повторений оператораFETCH
. Переменная основного языка, задающая параметр цикла< число выполнений >
, должна иметь тип данныхshort
(значение в диапазоне от 1 до 32767). Если переменная другого типа, при претрансляции будет выдана ошибка «Ожидалась целая переменная». Циклическое выполнение предложения предназначено для того случая, когда переменные (объявленные в конструкцииINTO …
илиUSING DESCRIPROR …
данного оператора) являются массивами. Если в список переменных включен массив, а конструкцияFOR
не указана, то в качестве числа повторений берется размер переменных-массивов, используемых в данном операторе. Если массивы при этом имеют неравные размеры, оператор возвращает ошибкуErrPCI_IncDim
. -
Параметр
< имя курсора >
задает статический курсор, по которому должна выполняться выборка данных. Курсор должен быть предварительно открыт. -
Параметр
< имя курсорной переменной >
задает динамический курсор, для которого предварительно должны быть выполнены следующие операции:-
объявление в секции описаний переменных основного языка как переменной типа «курсор» (
CURSOR
); -
выделение памяти с помощью оператора
ALLOCATE
; -
открытие путем исполнения хранимой процедуры.
-
-
Конструкция
< положение курсора >
задает порядок выбора очередной записи при выполнении оператора FETCH:-
NEXT
– выдать следующую запись множественной выборки данных; -
PRIOR
– выдать предыдущую запись множественной выборки данных; -
FIRST
– выдать первую запись множественной выборки данных; -
LAST
– выдать последнюю запись множественной выборки данных; -
ABSOLUTE
:< переменная >
– выдать указанную запись множественной выборки данных. Номер записи определяется значением аргумента< переменная >
, величина которого должна быть целым положительным числом; -
RELATIVE
:< переменная >
– выдать следующую запись относительно текущей. Относительный номер записи определяется значением аргумента< переменная >
, величина которого задается целым числом (положительным или отрицательным). Если, например, текущий номер выданной записи равенK
, то при значении аргументаN
будет выданаK+N
запись, а при значении аргумента–N K-N
запись (в том случае, если записи с такими номерами существуют).
-
-
Если
< положение курсора >
не задано, по умолчанию выбирается следующая запись (NEXT
). -
Если задана конструкция
FOR
, то допустимым< положением курсора >
является толькоNEXT
(в противном случае на этапе выполнения курсора фиксируется ошибочная ситуация «Неверный параметр»). -
Если при выполнении конструкции
FOR
конец выборки достигнут до исчерпания цикла, возвращается код завершения 0, а реальное количество загруженных записей заносится в псевдопеременнуюCntPCI_
. -
Параметр
USING|INTO < список переменных >
должен содержать список переменных, в которые будут загружаться выбираемые значения. Число и тип переменных должны строго соответствовать числу и типу выбираемых значений. -
Параметр
USING DESCRIPTOR < имя дескриптора >
используется для привязки динамических параметров. Дескриптор должен быть предварительно объявлен с помощью директивы SQLDESCRIBE
. -
Если модуль претранслирован в режиме совместимости со старой версией PCC (ключ
-V
претранслятора), то первая выборка осуществляется при открытии курсора, по умолчанию она выполняется при первомFETCH
. -
Оператор
FETCH
для хранения данных, полученных от СУБД ЛИНТЕР, использует буфер, размер которого равен по умолчанию 4096 байтам. Если размер ответа превышает размер буфера, на этапе выполнения выдается код завершения СУБД ЛИНТЕР 1014 («Заданный пользовательский буфер недостаточен»). Чтобы подобного не произошло, нужно увеличить размер буфера (см. операторEXEC LINTER OPTION AREASIZE
).
Пример
. . . EXEC SQL BEGIN DECLARE SECTION; CURSOR Cr; Int Var; EXEC SQL END DECLARE SECTION; EXEC SQL ALLOCATE :Cr; EXEC SQL EXECUTE BEGIN :Cr = stored_proc(); END; END-EXEC; EXEC SQL FETCH :Cr INTO :Var; . . . EXEC SQL CLOSE :Cr; EXEC SQL DEALLOCATE :Cr; . . .