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