Типы таблиц CONNECT - Каталог таблиц
Таблица каталога — это таблица, которая возвращает информацию о другой таблице или источнике данных. Она аналогична командам MariaDB, таким как DESCRIBE или SHOW. При применении к локальным таблицам, она просто дублирует функции этих команд, с заметным отличием, что это таблицы, которые могут использоваться в запросах как таблицы соединения или внутри подзапросов.
Но их основная задача — возможность запроса структуры внешних таблиц, которые нельзя напрямую запросить с помощью команд описания. Давайте рассмотрим пример:
Предположим, мы хотим получить доступ к таблицам из базы данных Microsoft Access как к таблице типа ODBC. Первая информация, которую мы должны получить, — это список таблиц, существующих в этом источнике данных. Для этого мы создадим таблицу каталога, которая вернёт её, извлечённую из набора результатов функции SQLTables ODBC:
create table tabinfo ( table_name varchar(128) not null, table_type varchar(16) not null) engine=connect table_type=ODBC catfunc=tables Connection='DSN=MS Access Database;DBQ=C:/Program Files/Microsoft Office/Office/1033/FPNWIND.MDB;';
Функция SQLTables возвращает набор результатов, содержащий следующие столбцы:
| Поле | Тип данных | NULL | Тип инф. | Значение флага |
|---|---|---|---|---|
| Table_Cat | char(128) | НЕТ | FLD_CAT | 17 |
| Table_Name | char(128) | НЕТ | FLD_SCHEM | 18 |
| Table_Name | char(128) | НЕТ | FLD_NAME | 1 |
| Table_Type | char(16) | НЕТ | FLD_TYPE | 2 |
| Remark | char(128) | НЕТ | FLD_REM | 5 |
Примечание: Тип инф. и Значение флага — это интерпретации CONNECT для этого результата.
Здесь мы могли бы опустить определения столбцов таблицы каталога или, как в приведённом примере, выбрать столбцы, возвращающие имя и тип таблиц. Если указаны, столбцы должны иметь точное имя соответствующего набора результатов SQLTables или получить другое имя со спецификацией соответствующего значения флага.
(Тип Table_Type может быть TABLE, SYSTEM TABLE, VIEW и т. д.)
Например, чтобы получить таблицы, которые мы хотим использовать, мы можем спросить:
select table_name from tabinfo where table_type = 'TABLE';
Это вернёт:
| имя_таблицы |
|---|
| Categories |
| Customers |
| Employees |
| Products |
| Shippers |
| Suppliers |
Теперь мы хотим создать таблицу для доступа к таблице CUSTOMERS. Поскольку CONNECT может извлекать описание столбцов таблиц ODBC, нет необходимости указывать их в операторе создания таблицы:
create table Customers engine=connect table_type=ODBC Connection='DSN=MS Access Database;DBQ=C:/Program Files/Microsoft Office/Office/1033/FPNWIND.MDB;';
Однако, если мы хотим их указать (чтобы впоследствии их изменить), мы должны знать, каковы определения столбцов этой таблицы. Мы можем получить эту информацию с помощью таблицы каталога. Вот как это сделать:
create table custinfo engine=connect table_type=ODBC tabname=customers catfunc=columns Connection='DSN=MS Access Database;DBQ=C:/Program Files/Microsoft Office/Office/1033/FPNWIND.MDB;';
В качестве альтернативы можно указать, какие столбцы таблицы каталога мы хотим:
create table custinfo ( column_name char(128) not null, type_name char(20) not null, length int(10) not null flag=7, prec smallint(6) not null flag=9) nullable smallint(6) not null) engine=connect table_type=ODBC tabname=customers catfunc=columns Connection='DSN=MS Access Database;DBQ=C:/Program Files/Microsoft Office/Office/1033/FPNWIND.MDB;';
Чтобы получить информацию о столбцах:
select * from custinfo;
что приводит к этой таблице:
| имя_столбца | имя_типа | длина | точность | NULL |
|---|---|---|---|---|
| CustomerID | VARCHAR | 5 | 0 | 1 |
| CompanyName | VARCHAR | 40 | 0 | 1 |
| ContactName | VARCHAR | 30 | 0 | 1 |
| ContactTitle | VARCHAR | 30 | 0 | 1 |
| Address | VARCHAR | 60 | 0 | 1 |
| City | VARCHAR | 15 | 0 | 1 |
| Region | VARCHAR | 15 | 0 | 1 |
| PostalCode | VARCHAR | 10 | 0 | 1 |
| Country | VARCHAR | 15 | 0 | 1 |
| Phone | VARCHAR | 24 | 0 | 1 |
| Fax | VARCHAR | 24 | 0 | 1 |
Теперь вы можете создать таблицу CUSTOMERS как:
create table Customers ( CustomerID varchar(5), CompanyName varchar(40), ContactName varchar(30), ContactTitle varchar(30), Address varchar(60), City varchar(15), Region varchar(15), PostalCode varchar(10), Country varchar(15), Phone varchar(24), Fax varchar(24)) engine=connect table_type=ODBC block_size=10 Connection='DSN=MS Access Database;DBQ=C:/Program Files/Microsoft Office/Office/1033/FPNWIND.MDB;';
Давайте объясним, что мы сделали: Прежде всего, создание таблицы каталога. Эта таблица возвращает набор результатов функции ODBC SQLColumns, отправленной в источник данных ODBC. Функции столбцов всегда возвращают набор данных, содержащий некоторые из следующих столбцов, в зависимости от типа таблицы:
| Поле | Тип данных | NULL | Тип инф. | Значение флага | Возвращается функцией |
|---|---|---|---|---|---|
| Table_Cat* | char(128) | НЕТ | FLD_CAT | 17 | ODBC, JDBC |
| Table_Schema* | char(128) | НЕТ | FLD_SCEM | 18 | ODBC, JDBC |
| Table_Name | char(128) | НЕТ | FLD_TABNAME | 19 | ODBC, JDBC |
| Column_Name | char(128) | НЕТ | FLD_NAME | 1 | ВСЕ |
| Data_Type | smallint(6) | НЕТ | FLD_TYPE | 2 | ВСЕ |
| Type_Name | char(30) | НЕТ | FLD_TYPENAME | 3 | ВСЕ |
| Column_Size* | int(10) | НЕТ | FLD_PREC | 4 | ВСЕ |
| Buffer_Length* | int(10) | НЕТ | FLD_LENGTH | 5 | ВСЕ |
| Decimal_Digits* | smallint(6) | НЕТ | FLD_SCALE | 6 | ВСЕ |
| Radix | smallint(6) | НЕТ | FLD_RADIX | 7 | ODBC, JDBC, MYSQL |
| Nullable | smallint(6) | НЕТ | FLD_NULL | 8 | ODBC, JDBC, MYSQL |
| Remarks | char(255) | НЕТ | FLD_REM | 9 | ODBC, JDBC, MYSQL |
| Collation | char(32) | НЕТ | FLD_CHARSET | 10 | MYSQL |
| Key | char(4) | НЕТ | FLD_KEY | 11 | MYSQL |
| Default_value | N.A. | FLD_DEFAULT | 12 | ||
| Privilege | N.A. | FLD_PRIV | 13 | ||
| Date_fmt | char(32) | НЕТ | FLD_DATEFMT | 15 | MYSQL |
| Xpath/Jpath | Varchar(256) | НЕТ | FLD_FORMAT | 16 | XML/JSON |
'*': Эти имена изменились с предыдущих версий CONNECT.
Примечание: ВСЕ включает типы таблиц ODBC, JDBC, MYSQL, DBF, CSV, PROXY, TBL, XML, JSON, XCOL и WMI. В будущем могут быть добавлены и другие.
Мы выбрали среди этих столбцов те, которые были полезны для нашего оператора создания, используя значение флага, когда мы дали им другое имя (регистронезависимое).
Параметры, используемые в этом определении, такие же, как и те, которые используются позже для фактических таблиц данных CUSTOMERS, за исключением того, что:
- Параметр
TABNAMEздесь обязателен для указания имени таблицы, которая запрашивается. - Параметр
CATFUNCбыл добавлен, чтобы указать, что это таблица каталога, и для указания, что мы хотим информацию о столбцах.
Примечание: Если бы параметр TABNAME не был указан, эта таблица возвращала бы столбцы всех таблиц, определённых в подключённом источнике данных.
В настоящее время доступные CATFUNC:
| Функция | Указано как: | Применимо к типам таблиц: |
|---|---|---|
| FNC_TAB | таблицы | ODBC, JDBC, MYSQL |
| FNC_COL | столбцы | ODBC, JDBC, MYSQL, DBF, CSV, PROXY, XCOL, TBL, WMI |
| FNC_DSN |
источники данных dsn sqldatasources |
ODBC |
| FNC_DRIVER |
драйверы sqldrivers |
ODBC, JDBC |
Примечание: Требуется только выделенная жирным шрифтом часть спецификации имени функции.
Функции DATASOURCE и DRIVERS соответственно возвращают список доступных источников данных и драйверов ODBC, доступных в системе.
Функция SQLDataSources возвращает набор результатов, содержащий следующие столбцы:
| Поле | Тип данных | NULL | Тип инф. | Значение флага |
|---|---|---|---|---|
| Name | varchar(256) | НЕТ | FLD_NAME | 1 |
| Description | varchar(256) | НЕТ | FLD_REM | 9 |
Для получения источника данных вы можете сделать, например:
create table datasources ( engine=CONNECT table_type=ODBC catfunc=DSN;
Функция SQLDrivers возвращает набор результатов, содержащий следующие столбцы:
| Поле | Тип | NULL | Тип инф. | Значение флага |
|---|---|---|---|---|
| Description | varchar(128) | ДА | FLD_NAME | 1 |
| Attributes | varchar(256) | ДА | FLD_REM | 9 |
Для получения списка драйверов вы можете сделать:
create table drivers engine=CONNECT table_type=ODBC catfunc=drivers;
Другой пример, таблица WMI
Для создания таблицы каталога, возвращающей имена атрибутов класса WMI, используйте те же параметры таблицы, что и с обычной таблицей WMI, плюс дополнительный параметр «catfunc=columns». Если указаны, столбцы такой таблицы каталога могут быть выбраны среди следующих:
| Имя | Тип | Флаг | Описание |
|---|---|---|---|
| Column_Name | CHAR | 1 | Имя свойства |
| Data_Type | INT | 2 | Тип данных SQL |
| Type_Name | CHAR | 3 | Имя типа SQL |
| Column_Size | INT | 4 | Длина поля в символах |
| Buffer_Length | INT | 5 | Зависит от кодирования |
| Scale | INT | 6 | Зависит от типа |
Если вы хотите использовать другое имя для столбца, установите опцию столбца Флаг.
Например, перед созданием таблицы "csprod" вы могли бы создать таблицу информации:
create table CSPRODCOL ( Column_name char(64) not null, Data_Type int(3) not null, Type_name char(16) not null, Length int(6) not null, Prec int(2) not null flag=6) engine=CONNECT table_type='WMI' catfunc=col;
Теперь запрос:
select * from csprodcol;
отобразит результат:
| Имя_столбца | Тип_данных | Имя_типа | Длина | Точность |
|---|---|---|---|---|
| Caption | 1 | CHAR | 255 | 1 |
| Description | 1 | CHAR | 255 | 1 |
| IdentifyingNumber | 1 | CHAR | 255 | 1 |
| Name | 1 | CHAR | 255 | 1 |
| SKUNumber | 1 | CHAR | 255 | 1 |
| UUID | 1 | CHAR | 255 | 1 |
| Vendor | 1 | CHAR | 255 | 1 |
| Version | 1 | CHAR | 255 | 1 |
Это может помочь определить столбцы соответствующей обычной таблицы.
Примечание 1: Длина столбца для таблицы Info, а также для обычной таблицы может быть выбрана произвольно, она просто должна быть достаточно большой для хранения возвращаемой информации.
Примечание 2: Столбец Scale возвращает 1 для текстовых столбцов (означает регистронезависимость); 2 для столбцов float и double; и 0 для других числовых столбцов.
Предельный размер результата таблицы каталога
Поскольку таблицы каталога обрабатываются как информация, получаемая при «поиске», когда столбцы таблиц не указаны в операторе Create Table, их набор результатов полностью извлекается и выделяется память.
По умолчанию это выделение памяти выполняется для максимального количества строк возврата:
| Catfunc | Максимальное количество строк |
|---|---|
| Drivers | 256 |
| Источники данных | 512 |
| Столбцы | 20 000 |
| Таблицы | 10 000 |
Когда количество извлеченных строк для таблицы превышает это максимальное значение, CONNECT выдает предупреждение. Это чаще всего происходит со столбцами (и также с таблицами) с некоторыми источниками данных, имеющими много таблиц, когда имя таблицы не указано.
В случае возникновения этой проблемы можно увеличить предельное значение по умолчанию, используя опцию MAXRES, например:
create table allcols engine=connect table_type=odbc connection='DSN=ORACLE_TEST;UID=system;PWD=manager' option_list='Maxres=110000' catfunc=columns;
Действительно, поскольку весь результат таблицы запоминается перед выполнением запроса; возвращаемое значение будет ограничено даже в запросе, таком как:
select count(*) from allcols;
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/connect-table-types-catalog-tables/