Дать описание таблицы
Назначение
Команда
FREL
предназначена для получения системной информации о хранящемся в БД
объекте (таблице, представлении, синониме).
Справочная информация содержит следующие сведения:
-
системный номер объекта;
-
идентификатор владельца;
-
имя объекта;
-
идентификатор узла;
-
маска доступа к записям объекта для пользователей категории PUBLIC;
-
тип объекта (таблица, представление, синоним);
-
количество атрибутов в объекте;
-
количество ключей в объекте;
-
процент заполнения страницы таблицы;
-
количество ключей в составном ключе;
-
число внешних (ссылочных) ключей в объекте;
-
уровень доступа на чтение;
-
уровень доступа на запись;
-
дата создания объекта;
-
время жизни объекта в БД;
-
номер страницы целостности;
-
идентификатор атрибута первичного ключа;
-
количество ссылок на таблицу;
-
описание аудита;
-
признак наличия INSERT-триггера;
-
признак наличия DELETE-триггера;
-
признак наличия UPDATE-триггера;
-
максимальный номер RowId;
-
число занятых RowId;
-
текущее количество записей в объекте;
-
длина записи в неупакованном виде;
-
количество экстентов области индексов;
-
количество экстентов области данных;
-
количество экстентов области BLOB-данных;
-
размер страницы файла индексов в блоках;
-
размер страницы файла области данных в блоках;
-
размер страницы файла области BLOB-данных в блоках;
-
номер первой страницы конвертера;
-
номер BLOB-столбца в схеме таблицы;
-
процент заполнения BLOB-страницы;
-
описание экстента области индексов;
-
описание экстента области данных;
-
описание экстента области BLOB-данных.
Параметры вызова
inter(CBL, VarBuf, NULL, [CondBuf], RowBuf);
Входные данные
Входными данными являются:
-
контрольный блок
CBL
; -
буфер описания параметров
VarBuf
.
В контрольном блоке должны быть заполнены поля:
Имя поля | Значение | |
---|---|---|
NumChan
| Номер канала | |
Command
|
"FREL"
| |
LnBufRow
| Длина буфера выборки данных | |
Node
| Имя ЛИНТЕР-сервера | |
PrzExe
| Режим обработки запроса |
Буфер описания параметров команды
VarBuf
должен содержать информацию об интересующей таблице в следующем
виде:
struct FREL_IN { L_LONG Owner; L_CHAR TblName[MAX_ID_LEN]; };
Примечания
-
Значение «идентификатор владельца» можно также получить при помощи команды
FUSR
интерфейса нижнего уровня или выбрать из системной таблицы$$$USR
(при наличии права на SELECT-запросы к этой таблице). -
Если длина имени объекта меньше MAX_ID_LEN символов, то поле
TblName
должно быть дополнено справа пробелами до MAX_ID_LEN символов.
Выходные данные
Выходными данными являются:
-
контрольный блок
CBL
; -
буфер выборки данных
RowBuf
.
В контрольном блоке будут возвращены:
Имя поля | Значение | |
---|---|---|
CodErr
| Код завершения запроса к СУБД ЛИНТЕР | |
LnBufRow
| Фактическая длина буфера выборки данных | |
RowId
|
Системный номер записи таблицы
$$$SYSRL ,
в которой содержится описание объекта
| |
SysErr
| Код состояния ОС |
Информация в буфере выборки данных
RowBuf
будет представлена в следующем виде:
struct FREL_OUT { L_LONG Table; L_LONG Owner; L_CHAR TblName[MAX_ID_LEN]; #if _VER_MAX >= 600 L_BYTE Desc[288]; #elif _VER_MAX >= 570 L_BYTE Desc[284]; #elif _VER_MAX >= 500 L_BYTE Desc[244]; #else L_BYTE Desc[162]; #endif };
Примечания
-
Длина поля
Desc
в буфере выборки данных зависит от используемой версии СУБД ЛИНТЕР. Значение макросу _VER_MAX присваивается в командной строке транслятора C/С++ (см. раздел «Условия применения»). -
Поле
Desc
является копией столбца $$$S14 из системной таблицы$$$SYSRL
. -
Структура столбца $$$S14 описана в документе «СУБД ЛИНТЕР. Системные таблицы и представления», подраздел «$$$SYSRL».
Описание
При выполнении команды СУБД сначала просматривает очередь таблиц,
размещенную в оперативной памяти ядра, в поисках описания
указанного объекта.
Если описание объекта в очереди не найдено, поиск продолжается в
системной таблице
$$$SYSRL
. Из этого алгоритма следует, что в зависимости
от параметров запуска ядра СУБД и способа получения описания объекта
результаты, в общем случае, могут быть различными.
Если ядро СУБД запущено с ключом
SYNC
, то результаты выполнения команды
FREL
и SELECT-запроса из таблицы
$$$SYSRL
будут совпадать.
Если ядро СУБД запущено с ключом
NOSYNC
, то результаты выполнения команды
FREL
и SELECT-запроса
из таблицы
$$$SYSRL
могут отличаться между собой, а именно, полученная с помощью
команды
FREL
информация
является
«самой новой»
(в отличие от полученной SELECT-запросом из таблицы
$$$SYSRL
).
То есть, если объект был только что создан, информация о нем записана
в очереди таблиц, расположенной в оперативной памяти ядра, и еще не
сброшена в файлы БД,
то по команде
FREL
описание объекта будет получено, а по SELECT-запросу из таблицы
$$$SYSRL
– нет.
Если в таком режиме запуска ядра для получения системной информации об
объекте предполагается использовать вместо команды
FREL
SELECT-запрос,
то для исключения рассогласования данных перед его подачей надо
выполнить команду
SNAP
.
Коды завершения
Код | Описание | |
---|---|---|
NORMAL | Нормальное завершение | |
SMALLBUFKOR | Недостаточный размер буфера выборки данных | |
EORR | Указанный объект не найден |
Пример формирования команды
#include < string.h > #include < stdlib.h > #include "inter.h" L_LONG LinterFREL(TCBL * pCBL, FREL_IN * pIn, FREL_OUT * pOut) { memcpy(pCBL- >Command, "FREL", 4); pCBL- >LnBufRow = sizeof(FREL_OUT); pCBL- >PrzExe &= ~Q_ASYNC; inter(pCBL, pIn, NULL, NULL, pOut); return pCBL- >CodErr; }
Пример использования команды
#include < stdio.h > #include < stdlib.h > #include < string.h > #include "inter.h" #include "exlib.h" #ifndef WINCE int main() #else int exfrel() #endif { TCBL CBLconnect; L_CHAR Name_Pass[] = "SYSTEM/MANAGER8"; L_CHAR Node[] = " "; L_WORD Priority = 0; L_LONG PrzExe = M_EXCLUSIVE | Q_ENCODE | M_BINARY; L_LONG Err; L_LONG ID; L_CHAR User[] = "SYSTEM"; L_CHAR Table[] = "PERSON"; FREL_IN In; FREL_OUT Out; 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 = LinterFUSR(&CBLconnect, User, &ID); if (Err != NORMAL) PrintError(&CBLconnect); In.Owner = ID; memset(In.TblName, ' ', MAX_ID_LEN); strncpy(In.TblName, Table, strlen(Table)); Err = LinterFREL(&CBLconnect, &In, &Out); if (Err != NORMAL) PrintError(&CBLconnect); printf("FREL:\n"); printf("\tOut.Table=%ld\n\tOwner=%ld\n", Out.Table, Out.Owner); printf("End Example\n"); return 0; }