Una tabla de catálogo es aquella que devuelve información sobre otra tabla o fuente de datos. Es similar a los comandos de MariaDB como DESCRIBE
o SHOW
hacer. Aplicado a tablas locales, esto simplemente duplica lo que hacen estos comandos, con la notable diferencia de que son tablas y se pueden usar dentro de consultas como tablas unidas o dentro de sub-selecciones.
Pero su principal interés es permitir la consulta de la estructura de tablas externas que no se pueden consultar directamente con comandos de descripción. Veamos un ejemplo:
Supongamos que queremos acceder a las tablas desde una base de datos de Microsoft Access como una tabla de tipo ODBC. La primera información que debemos obtener es la lista de tablas existentes en esta fuente de datos. Para obtenerlo, crearemos una tabla de catálogo que lo devolverá extraído del conjunto de resultados de la función ODBC de SQLTables:
createtable tabinfo ( table_name varchar(128)notnull, table_type varchar(16)notnull)engine=connect table_type=ODBC catfunc=tables Connection='DSN=MS Access Database;DBQ=C:/Program Files/Microsoft Office/Office/1033/FPNWIND.MDB;';
La función SQLTables devuelve un conjunto de resultados con las siguientes columnas:
Campo | Tipo de datos | Nulo | Tipo de información | Valor de la bandera |
---|---|---|---|---|
Table_Cat | carbón (128) | NO | FLD_CAT | 17 |
Nombre de la tabla | carbón (128) | NO | FLD_SCHEM | 18 |
Nombre de la tabla | carbón (128) | NO | FLD_NAME | 1 |
Table_Type | carbón (16) | NO | FLD_TYPE | 2 |
Observación | carbón (128) | NO | FLD_REM | 5 |
Nota: El tipo de información y el valor del indicador son interpretaciones de CONNECT de este resultado.
Aquí podríamos haber omitido las definiciones de columna de la tabla de catálogo o, como en el ejemplo anterior, elegir las columnas que devuelven el nombre y el tipo de las tablas. Si se especifica, las columnas deben tener el nombre exacto del conjunto de resultados de SQLTables correspondiente, o recibir un nombre diferente con la especificación del valor del indicador correspondiente.
(El Table_Type puede ser TABLE, SYSTEM TABLE, VIEW, etc.)
Por ejemplo, para obtener las tablas que queremos usar podemos preguntar:
select table_name from tabinfo where table_type ='TABLE';
Esto devolverá:
nombre de la tabla |
---|
Categorías |
Clientes |
Empleados |
Productos |
Cargadores |
Proveedores |
Ahora queremos crear la tabla para acceder a la tabla CLIENTES. Dado que CONNECT puede recuperar la descripción de columna de las tablas ODBC, no es necesario especificarlas en la declaración de creación de tabla:
createtable Customers engine=connect table_type=ODBC Connection='DSN=MS Access Database;DBQ=C:/Program Files/Microsoft Office/Office/1033/FPNWIND.MDB;';
Sin embargo, si preferimos especificarlos (para eventualmente modificarlos) debemos saber cuáles son las definiciones de columna de esa tabla. Podemos obtener esta información con una tabla de catálogo. Asi es como se hace:
createtable 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;';
Alternativamente, es posible especificar qué columnas de la tabla de catálogo queremos:
createtable custinfo ( column_name char(128)notnull, type_name char(20)notnull, length int(10)notnull flag=7, prec smallint(6)notnull flag=9) nullable smallint(6)notnull)engine=connect table_type=ODBC tabname=customers catfunc=columns Connection='DSN=MS Access Database;DBQ=C:/Program Files/Microsoft Office/Office/1033/FPNWIND.MDB;';
Para obtener la información de la columna:
select*from custinfo;
que da como resultado esta tabla:
column_name | escribe un nombre | largo | prec | anulable |
---|---|---|---|---|
Identificación del cliente | VARCHAR | 5 | 0 | 1 |
Nombre de empresa | VARCHAR | 40 | 0 | 1 |
Nombre de contacto | VARCHAR | 30 | 0 | 1 |
Título de contacto | VARCHAR | 30 | 0 | 1 |
Dirección | VARCHAR | 60 | 0 | 1 |
Ciudad | VARCHAR | 15 | 0 | 1 |
Región | VARCHAR | 15 | 0 | 1 |
Código postal | VARCHAR | 10 | 0 | 1 |
País | VARCHAR | 15 | 0 | 1 |
Teléfono | VARCHAR | 24 | 0 | 1 |
Fax | VARCHAR | 24 | 0 | 1 |
Ahora puede crear la tabla CLIENTES como:
createtable 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;';
Expliquemos lo que hicimos aquí: En primer lugar, la creación de la tabla de catálogo. Esta tabla devuelve el conjunto de resultados de una función ODBC SQLColumns enviada a la fuente de datos ODBC. Las funciones de columnas siempre devuelven un conjunto de datos que tiene algunas de las siguientes columnas, según el tipo de tabla:
Campo | Tipo de datos | Nulo | Tipo de información | Valor de la bandera | Devuelto por |
---|---|---|---|---|---|
Table_Cat * | carbón (128) | NO | FLD_CAT | 17 | ODBC, JDBC |
Tabla_esquema * | carbón (128) | NO | FLD_SCEM | 18 | ODBC, JDBC |
Nombre de la tabla | carbón (128) | NO | FLD_TABNAME | 19 | ODBC, JDBC |
Column_Name | carbón (128) | NO | FLD_NAME | 1 | TODOS |
Tipo de datos | pequeño (6) | NO | FLD_TYPE | 2 | TODOS |
Escribe un nombre | carbón (30) | NO | FLD_TYPENAME | 3 | TODOS |
Column_Size * | int (10) | NO | FLD_PREC | 4 | TODOS |
Buffer_Length * | int (10) | NO | FLD_LENGTH | 5 | TODOS |
Dígitos decimales* | pequeño (6) | NO | FLD_SCALE | 6 | TODOS |
Base | pequeño (6) | NO | FLD_RADIX | 7 | ODBC, JDBC, MYSQL |
Anulable | pequeño (6) | NO | FLD_NULL | 8 | ODBC, JDBC, MYSQL |
Observaciones | char (255) | NO | FLD_REM | 9 | ODBC, JDBC, MYSQL |
Colación | carbón (32) | NO | FLD_CHARSET | 10 | MYSQL |
Llave | carbón (4) | NO | FLD_KEY | 11 | MYSQL |
Valor por defecto | N / A | FLD_DEFAULT | 12 | ||
Privilegio | N / A | FLD_PRIV | 13 | ||
Date_fmt | carbón (32) | NO | FLD_DATEFMT | 15 | MYSQL |
XPath / Jpath | Varchar (256) | NO | FLD_FORMAT | dieciséis | XML / JSON |
‘*’: Estos nombres han cambiado desde versiones anteriores de CONNECT.
Nota: TODOS incluye los tipos de tabla ODBC, JDBC, MYSQL, DBF, CSV, PROXY, TBL, XML, JSON, XCOL y WMI. Más tarde se podrían agregar más.
Elegimos entre estas columnas las que eran útiles para nuestra declaración de creación, usando el valor de la bandera cuando les dimos un nombre diferente (no distingue entre mayúsculas y minúsculas).
Las opciones utilizadas en esta definición son las mismas que se utilizaron más adelante para las tablas de datos de CLIENTES reales, excepto que:
- los
TABNAME
La opción es obligatoria aquí para especificar cuál es el nombre de la tabla consultada. - los
CATFUNC
Se agregó la opción tanto para indicar que se trata de una tabla de catálogo como para especificar que queremos información de columna.
Nota: Si el TABNAME
Si no se hubiera especificado la opción, esta tabla habría devuelto las columnas de todas las tablas definidas en la fuente de datos conectada.
Actualmente el disponible CATFUNC
están:
Función | Especificado como: | Se aplica a los tipos de mesa: |
---|---|---|
FNC_TAB | pestañales | ODBC, JDBC, MYSQL |
FNC_COL | columnaumns | ODBC, JDBC, MYSQL, DBF, CSV, PROXY, XCOL, TBL, WMI |
FNC_DSN | fuente de datoss dsn sqldatasources |
ODBC |
FNC_DRIVER | conductors sqldrivers |
ODBC, JDBC |
Nota: Solo se requiere la parte en negrita de la especificación del nombre de la función.
los DATASOURCE
y DRIVERS
Las funciones devuelven respectivamente la lista de fuentes de datos disponibles y controladores ODBC disponibles en el sistema.
La función SQLDataSources devuelve un conjunto de resultados con las siguientes columnas:
Campo | Tipo de datos | Nulo | Tipo de información | Valor de la bandera |
---|---|---|---|---|
Nombre | varchar (256) | NO | FLD_NAME | 1 |
Descripción | varchar (256) | NO | FLD_REM | 9 |
Para obtener la fuente de datos, puede hacer, por ejemplo:
createtable datasources (engine=CONNECT table_type=ODBC catfunc=DSN;
La función SQLDrivers devuelve un conjunto de resultados con las siguientes columnas:
Campo | Escribe | Nulo | Tipo de información | Valor de la bandera |
---|---|---|---|---|
Descripción | varchar (128) | SÍ | FLD_NAME | 1 |
Atributos | varchar (256) | SÍ | FLD_REM | 9 |
Puede obtener la lista de controladores con:
createtable drivers engine=CONNECT table_type=ODBC catfunc=drivers;
Otro ejemplo, tabla WMI
Para crear una tabla de catálogo que devuelva los nombres de atributo de una clase WMI, use las mismas opciones de tabla que se usan con la tabla WMI normal más la opción adicional ‘catfunc = columnas’. Si se especifica, las columnas de dicha tabla de catálogo se pueden elegir entre las siguientes:
Nombre | Escribe | Bandera | Descripción |
---|---|---|---|
Column_Name | CARBONIZARSE | 1 | El nombre de la propiedad |
Tipo de datos | EN T | 2 | El tipo de datos SQL |
Escribe un nombre | CARBONIZARSE | 3 | El nombre del tipo SQL |
Column_Size | EN T | 4 | La longitud del campo en caracteres |
Buffer_Length | EN T | 5 | Depende de la codificación |
Escala | EN T | 6 | Depende del tipo |
Si desea utilizar un nombre diferente para una columna, configure la opción de columna Marcar.
Por ejemplo, antes de crear la tabla “csprod”, podría haber creado la tabla de información:
createtable CSPRODCOL ( Column_name char(64)notnull, Data_Type int(3)notnull, Type_name char(16)notnull, Length int(6)notnull, Prec int(2)notnull flag=6)engine=CONNECT table_type='WMI' catfunc=col;
Ahora la consulta:
select*from csprodcol;
mostrará el resultado:
Column_name | Tipo de datos | Escribe un nombre | Largo | Prec |
---|---|---|---|---|
Subtítulo | 1 | CARBONIZARSE | 255 | 1 |
Descripción | 1 | CARBONIZARSE | 255 | 1 |
Número de identificación | 1 | CARBONIZARSE | 255 | 1 |
Nombre | 1 | CARBONIZARSE | 255 | 1 |
SKUNumber | 1 | CARBONIZARSE | 255 | 1 |
UUID | 1 | CARBONIZARSE | 255 | 1 |
Vendedor | 1 | CARBONIZARSE | 255 | 1 |
Versión | 1 | CARBONIZARSE | 255 | 1 |
Esto puede ayudar a definir las columnas de la tabla normal coincidente.
Nota 1: La longitud de la columna, tanto para la tabla Info como para la tabla normal, se puede elegir arbitrariamente, solo debe ser suficiente para contener la información devuelta.
Nota 2: La columna Escala devuelve 1 para las columnas de texto (lo que significa que no distingue entre mayúsculas y minúsculas); 2 para columnas flotantes y dobles; y 0 para otras columnas numéricas.
Límite de tamaño de resultado de la tabla de catálogo
Debido a que las tablas de catálogo se procesan como la información recuperada por “Discovery” cuando las columnas de la tabla no se especifican en una instrucción Create Table, su conjunto de resultados se recupera por completo y se asigna memoria.
De forma predeterminada, esta asignación se realiza para un número máximo de línea de retorno de:
Catfunc | lineas maximas |
---|---|
Conductores | 256 |
Fuentes de datos | 512 |
Columnas | 20.000 |
Mesas | 10,000 |
Cuando el número de líneas recuperadas para una tabla supera este máximo, CONNECT emite una advertencia. Esto es propenso a ocurrir principalmente con columnas (y también tablas) con algunas fuentes de datos que tienen muchas tablas cuando no se especifica el nombre de la tabla.
Si esto sucede, es posible aumentar el límite predeterminado usando la opción MAXRES, por ejemplo:
createtable allcols engine=connect table_type=odbc connection='DSN=ORACLE_TEST;UID=system;PWD=manager' option_list='Maxres=110000' catfunc=columns;
De hecho, debido a que todo el resultado de la tabla se memoriza antes de que se ejecute la consulta; el valor devuelto estaría limitado incluso en una consulta como:
selectcount(*)from allcols;
El contenido reproducido en este sitio es propiedad de sus respectivos dueños, y MariaDB no revisa este contenido con anticipación. Los puntos de vista, la información y las opiniones expresadas por este contenido no representan necesariamente las de MariaDB o de cualquier otra parte.
Calificaciones y comentarios
Finalizando este artículo puedes encontrar los informes de otros gestores de proyectos, tú asimismo tienes el poder insertar el tuyo si te apetece.