Установить параметры курсора
Назначение
По любому каналу (главному или подчиненному) можно выдать 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
в зависимости от кода операции.
Код операции | Содержание полей блока CBL | ||
---|---|---|---|
Prior | NumChan | RowCount | |
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; }