Saltar al contenido

Informix SQL – Lista de todos los campos y tablas

Posterior a de esta prolongada búsqueda de datos pudimos solucionar esta obstáculo que suelen tener muchos de nuestros usuarios. Te ofrecemos la solución y esperamos que sea de mucha apoyo.

Solución:

Usando la notación JOIN preferida:

SELECT TRIM(t.tabname) || '.' || TRIM(c.colname) AS table_dot_column
  FROM "informix".systables  AS t
  JOIN "informix".syscolumns AS c ON t.tabid = c.tabid
 WHERE t.tabtype = 'T'
   AND t.tabid >= 100
 ORDER BY t.tabname, c.colno;

o la antigua notación de cláusula de unión-en-dónde:

SELECT TRIM(t.tabname) || '.' || TRIM(c.colname) AS table_dot_column
  FROM "informix".systables AS t, "informix".syscolumns AS c
 WHERE t.tabid = c.tabid
   AND t.tabtype = 'T'
   AND t.tabid >= 100
 ORDER BY t.tabname, c.colno;

Suponiendo que está utilizando una versión suficientemente reciente de IDS, puede ordenar por columnas no citadas en la lista de selección. Si recibe quejas, agregue las columnas de pedido a la lista de selección.

El criterio de unión es obvio; tabtype = ‘T’ enumera solo tablas, no vistas, sinónimos y otros elementos enumerados en systables; el tabid >= 100 solo enumera las tablas creadas explícitamente en la base de datos, no en el catálogo del sistema.

Esto no incluye la información de tipo; si quieres eso, tienes que trabajar un poco más. Encontrarás un archivo $INFORMIXDIR/etc/xpg4_is.sql que contiene una aproximación cruda a una versión antigua del esquema de información XPG4 (estándar X/Open) (de ahí el nombre del archivo). Allí, hay funciones, etc. para decodificar información de tipo de syscolumns.coltype y syscolumns.collength en cadenas reconocibles. Sin embargo, sospecho firmemente que no maneja tipos DISTINCT, ni otros tipos definidos por el usuario. Estaré encantado de estar equivocado, pero… Si agrega las partes relevantes de ese archivo a su base de datos, también debería poder obtener la información del tipo.

También tenga en cuenta que todos los comandos INFO en ISQL y DB-Access se simulan en el front-end, no se ejecutan en el servidor IDS. Básicamente, los programas toman la solicitud y la convierten en una declaración SQL más compleja. Ver el código en el archivo. sqlinfo.ec eso es parte de SQLCMD (disponible en el archivo de software IIUG) para saber cómo mi programa SQLCMD maneja las declaraciones INFO. (Nota: la salida INFO de SQLCMD tiene un formato diferente al de la salida INFO de ISQL y DB-Access).

Como menciona la respuesta de Jonathan Leffer, un manejo completo de los tipos de columna y los detalles de la columna se complica como se puede ver en la documentación de SYSCOLUMNS. Pero si está buscando en la base de datos que no usa tipos más complicados, esta adición a su secuencia de comandos mostrará el tipo básico y si se permiten NULL:

SELECT TRIM(t.tabname) || '.' || TRIM(c.colname) AS table_dot_column,
CASE 
  WHEN MOD(coltype,256)=0 THEN 'CHAR' 
  WHEN MOD(coltype,256)=1 THEN 'SMALLINT' 
  WHEN MOD(coltype,256)=2 THEN 'INTEGER' 
  WHEN MOD(coltype,256)=3 THEN 'FLOAT' 
  WHEN MOD(coltype,256)=4 THEN 'SMALLFLOAT' 
  WHEN MOD(coltype,256)=5 THEN 'DECIMAL' 
  WHEN MOD(coltype,256)=6 THEN 'SERIAL' 
  WHEN MOD(coltype,256)=7 THEN 'DATE' 
  WHEN MOD(coltype,256)=8 THEN 'MONEY' 
  WHEN MOD(coltype,256)=9 THEN 'NULL' 
  WHEN MOD(coltype,256)=10 THEN 'DATETIME' 
  WHEN MOD(coltype,256)=11 THEN 'BYTE' 
  WHEN MOD(coltype,256)=12 THEN 'TEXT' 
  WHEN MOD(coltype,256)=13 THEN 'VARCHAR' 
  WHEN MOD(coltype,256)=14 THEN 'INTERVAL' 
  WHEN MOD(coltype,256)=15 THEN 'NCHAR' 
  WHEN MOD(coltype,256)=16 THEN 'NVARCHAR' 
  WHEN MOD(coltype,256)=17 THEN 'INT8' 
  WHEN MOD(coltype,256)=18 THEN 'SERIAL8' 
  WHEN MOD(coltype,256)=19 THEN 'SET' 
  WHEN MOD(coltype,256)=20 THEN 'MULTISET' 
  WHEN MOD(coltype,256)=21 THEN 'LIST' 
  WHEN MOD(coltype,256)=22 THEN 'ROW (unnamed)' 
  WHEN MOD(coltype,256)=23 THEN 'COLLECTION' 
  WHEN MOD(coltype,256)=40 THEN 'LVARCHAR fixed-length opaque types' 
  WHEN MOD(coltype,256)=41 THEN 'BLOB, BOOLEAN, CLOB variable-length opaque types' 
  WHEN MOD(coltype,256)=43 THEN 'LVARCHAR (client-side only)' 
  WHEN MOD(coltype,256)=45 THEN 'BOOLEAN' 
  WHEN MOD(coltype,256)=52 THEN 'BIGINT' 
  WHEN MOD(coltype,256)=53 THEN 'BIGSERIAL' 
  WHEN MOD(coltype,256)=2061 THEN 'IDSSECURITYLABEL'
  WHEN MOD(coltype,256)=4118 THEN 'ROW (named)' 
  ELSE TO_CHAR(coltype)
END AS Type,
BITAND(coltype,256)=256 AS NotNull
  FROM "informix".systables  AS t
  JOIN "informix".syscolumns AS c ON t.tabid = c.tabid
 WHERE t.tabtype = 'T'
   AND t.tabid >= 100
 ORDER BY t.tabname, c.colno;

Si piensas que ha sido útil nuestro post, te agradeceríamos que lo compartas con el resto juniors de esta manera nos ayudas a extender esta información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *