Установить параметры курсора

Назначение

По любому каналу (главному или подчиненному) можно выдать SELECT-запрос. Полученная в результате выполнения запроса выборка данных называется курсором. Если приложение открыло несколько каналов и выдало несколько SELECT-запросов, будет организовано соответствующее количество курсоров. Чтобы иметь возможность работать с курсором в любом открытом канале (а не только в том, где курсор был создан), ему следует присвоить имя. Если имя курсору не установлено, он считается неименованным. Имя курсора используется в SQL-запросах, работающих с текущим положением курсора (операторы update/delete … current of [< курсор >] cursor). Если в этих запросах имя курсора явно не задается, считается, что они относятся к курсору, созданному в канале, по которому подается на выполнение SQL-запрос.

 

Для создания или изменения имени курсора предназначена команда SETO.

Дополнительно команда SETO используется для административного контроля за исполнением SQL-запроса:

  • изменение приоритета запроса;

  • приостановка/продолжение выполнения запроса.

Параметры вызова

inter(CBL, NULL, NULL, NULL, [RowBuf]);

Входные данные

Входными данными являются:

  • контрольный блок CBL;

  • буфер выборки данных RowBuf.

В контрольном блоке должны быть заполнены поля:

Имя поля Значение
NumChan Номер канала, по которому выполняется команда
Prior Устанавливаемый приоритет
Command "SETO"
Node Имя ЛИНТЕР-сервера
LnBufRow Длина имени курсора
RowId Код операции
RowCount Номер канала, для которого выполняется команда

Буфер RowBuf должен содержать символьную строку длиной не более MAX_ID_LEN символов, задающую имя курсора.

Коды операций задаются в поле RowId (символические имена описаны в inter.h):

Код Значение
crName Установить имя курсора
crPrior Установить приоритет канала
crQueryPrior Установить приоритет запроса
crCancel Прервать выполнение запроса
crPause Приостановить выполнение запроса
crContinue Продолжить выполнение запроса
crMode Изменить режим канала

В таблице 8 приведены значения полей блока CBL в зависимости от кода операции.

Таблица 8. Значения полей блока CBL

Код операции

Содержание полей блока CBL
PriorNumChanRowCount
crName  Номер канала, по которому выполняется команда SETO  
crPrior Новый приоритет--//--Номер канала, для которого изменяется приоритет
crQueryPrior Новый приоритет запроса--//-- 
crCancel  --//-- 
crPause  --//--Номер канала, где должен быть приостановлен текущий запрос
crContinue  --//--Номер канала, где должен быть продолжен текущий запрос
crMode  --//-- 

Выходные данные

Выходными данными является контрольный блок CBL.

В нем будут возвращены:

Имя поля Значение
CodErr Код завершения запроса к СУБД ЛИНТЕР
SysErr Код состояния ОС
Описание

Присвоение имени курсору необязательно делать после выполнения SELECT-запроса, оно может быть установлено заранее для любого открытого канала. Если в канале было последовательно задано несколько SELECT-запросов и для данного канала было задано имя курсора, то каждая выборка (курсор) будет иметь одно и то же имя.

Для выполнения операций crCancel, crPause, crContinue по каналам других пользователей необходимы привилегии администратора СУБД.

Коды завершения
Код Описание
DupCurName Дубликат имени курсора
ERRFALSEOPER Неверный код операции
ERRFALSEPRIOR Неверное значение приоритета
ERRFALSECHSTATE Неверное состояние канала. Выдается при попытке продолжить выполнение запроса по каналу, который не был приостановлен
QueryCanceled Запрос прерван. Возвращается для канала, запрос которого был прерван
Пример формирования команды
#include < string.h >
#include < stdlib.h >
#include "inter.h"

L_LONG LinterSETO(TCBL *pCBL, L_CHAR *NameCur)
   {
   pCBL- >RowId = crName;
   memcpy(pCBL- >Command, "SETO", 4);
   if ((pCBL- >LnBufRow = strlen(NameCur))  > MAX_ID_LEN)

     {
     return SQLLONGID;
     }
   pCBL- >PrzExe &= ~Q_ASYNC;
   inter(pCBL, NULL, NULL, NULL, NameCur);
   return pCBL- >CodErr;
   }
Пример использования команды
#include < stdio.h >
#include < stdlib.h >
#include < string.h >
#include "inter.h"
#include "exlib.h"


#ifndef WINCE
int    main()
#else
int    exseto()
#endif
{
    TCBL    CBLconnect,
            CBL1;
    L_CHAR  Name_Pass[]="SYSTEM/MANAGER8";
    L_CHAR  Node[]="    ";
    L_CHAR  NameCur[]="Cursor1";
    L_WORD  Priority=0;
    L_LONG PrzExe=M_EXCLUSIVE | Q_ENCODE | M_BINARY;
    L_LONG Err;
memset(&CBLconnect,0,sizeof(TCBL));
Err=LinterOPEN(&CBLconnect, Name_Pass, Node, Priority, PrzExe);
    if (Err != NORMAL)
        PrintError(&CBLconnect);
    printf("Connect to RDBMS Linter\n");

Err=LinterOCUR(&CBL1, CBLconnect.NumChan, Priority, PrzExe);
    if (Err != NORMAL)
        PrintError(&CBL1);
    printf("Open Channel\n");

Err=LinterSETO(&CBL1, NameCur);
if (Err != NORMAL)
    PrintError(&CBL1);
    printf("Set Name for Channel\n");
    printf("End Example\n");
    return 0;
}