Простая выборка

Назначение

Последовательная выборка записей из курсора (статического или динамического).

Синтаксис
 
< простая выборка >::=
EXEC SQL [FOR :< число выполнений > ]
   FETCH {< имя курсора > | :< имя курсорной переменной >}
   [< положение курсора >]
   {USING | INTO} {< список переменных >
   | USING DESCRIPTOR < имя дескриптора >};
< положение курсора  >::=
NEXT| PRIOR | FIRST | LAST | {[ABSOLUTE | RELATIVE] :< переменная >}
Описание
  1. Конструкция FOR задает число повторений оператора FETCH. Переменная основного языка, задающая параметр цикла < число выполнений >, должна иметь тип данных short (значение в диапазоне от 1 до 32767). Если переменная другого типа, при претрансляции будет выдана ошибка «Ожидалась целая переменная». Циклическое выполнение предложения предназначено для того случая, когда переменные (объявленные в конструкции INTO … или USING DESCRIPROR … данного оператора) являются массивами. Если в список переменных включен массив, а конструкция FOR не указана, то в качестве числа повторений берется размер переменных-массивов, используемых в данном операторе. Если массивы при этом имеют неравные размеры, оператор возвращает ошибку ErrPCI_IncDim.

  2. Параметр < имя курсора > задает статический курсор, по которому должна выполняться выборка данных. Курсор должен быть предварительно открыт.

  3. Параметр < имя курсорной переменной > задает динамический курсор, для которого предварительно должны быть выполнены следующие операции:

    • объявление в секции описаний переменных основного языка как переменной типа «курсор» (CURSOR);

    • выделение памяти с помощью оператора ALLOCATE;

    • открытие путем исполнения хранимой процедуры.

  4. Конструкция < положение курсора > задает порядок выбора очередной записи при выполнении оператора FETCH:

    • NEXT – выдать следующую запись множественной выборки данных;

    • PRIOR – выдать предыдущую запись множественной выборки данных;

    • FIRST – выдать первую запись множественной выборки данных;

    • LAST – выдать последнюю запись множественной выборки данных;

    • ABSOLUTE :< переменная > – выдать указанную запись множественной выборки данных. Номер записи определяется значением аргумента < переменная >, величина которого должна быть целым положительным числом;

    • RELATIVE :< переменная > – выдать следующую запись относительно текущей. Относительный номер записи определяется значением аргумента < переменная >, величина которого задается целым числом (положительным или отрицательным). Если, например, текущий номер выданной записи равен K, то при значении аргумента N будет выдана K+N запись, а при значении аргумента –N K-N запись (в том случае, если записи с такими номерами существуют).

  5. Если < положение курсора > не задано, по умолчанию выбирается следующая запись (NEXT).

  6. Если задана конструкция FOR, то допустимым < положением курсора > является только NEXT (в противном случае на этапе выполнения курсора фиксируется ошибочная ситуация «Неверный параметр»).

  7. Если при выполнении конструкции FOR конец выборки достигнут до исчерпания цикла, возвращается код завершения 0, а реальное количество загруженных записей заносится в псевдопеременную CntPCI_.

  8. Параметр USING|INTO < список переменных > должен содержать список переменных, в которые будут загружаться выбираемые значения. Число и тип переменных должны строго соответствовать числу и типу выбираемых значений.

  9. Параметр USING DESCRIPTOR < имя дескриптора > используется для привязки динамических параметров. Дескриптор должен быть предварительно объявлен с помощью директивы SQL DESCRIBE.

  10. Если модуль претранслирован в режиме совместимости со старой версией PCC (ключ -V претранслятора), то первая выборка осуществляется при открытии курсора, по умолчанию она выполняется при первом FETCH.

  11. Оператор 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;
. . .