Informix SQL-liste tous les champs et les tables

Informix iSQL a une commande"info tables; " qui montre toutes les tables.

La syntaxe pour visualiser les champs et leurs types de données respectifs est"info columns for table;"

Est-il une commande similaire qui montre le tableau.champ pour toutes les tables et tous les champs?

16
demandé sur Brian Tompsett - 汤莱恩 2009-09-04 22:17:56

3 réponses

en utilisant la notation de jointure préférée:

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;

ou à l'ancienne, rejoignez-en-clause where-notation:

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;

en supposant que vous utilisez une version suffisamment récente d'IDS, vous pouvez commander par des colonnes non citées dans la liste select. Si vous recevez des plaintes, ajoutez les colonnes de commande à la liste select.

le critère de jointure est évident; le tabtype = ' T ' ne Liste que les tableaux, et non les vues, Les synonymes et autres éléments énumérés dans les systèmes; le tabid >= 100 ne Liste que les tables créées explicitement dans la base de données, pas le catalogue système.

ceci n'inclut pas les informations de type - si vous voulez cela, vous devez faire un peu plus de travail. Vous trouverez un fichier $INFORMIXDIR/etc/xpg4_is.sql qui contient une approximation grossière d'une ancienne version du schéma D'Information XPG4 (X/Open standard) (d'où le nom du fichier). Là, il y a des fonctions etc pour décoder les informations de type de syscolumns.coltype et syscolumns.collength en cordes reconnaissables. Cependant, je soupçonne fortement qu'il ne traite pas de types distincts, ni d'autres types définis par l'utilisateur. Je serai ravi d'être tort, mais... Si vous ajoutez les parties pertinentes de ce fichier dans votre base de données, vous devriez être en mesure d'obtenir les informations de type.

notez également que toutes les commandes D'information dans ISQL et DB-Access sont simulées à l'avant, et non exécutées dans le serveur IDS. Fondamentalement, les programmes prennent la requête et la convertissent en une déclaration SQL plus complexe. Voir le code dans le fichier sqlinfo.ec Cela fait partie de SQLCMD (disponible à partir du Iiug Software Archive) pour savoir comment mon programme SQLCMD traite les informations. (Note: la sortie INFO de SQLCMD est formatée différemment de la sortie INFO D'ISQL et de DB-Access.)

28
répondu Jonathan Leffler 2013-01-17 15:02:45

utilisez la table syscolumns. Ces informations sont décrites dans la section IBM Informix Guide to SQL

j'ai fait des utilitaires Python simples qui montrent des informations de schéma pour Informix, Oracle et PostgreSQL. Ils sont utiles si vous devez comparer des bases de données.

1
répondu Michał Niklas 2009-09-04 20:13:47

comme le mentionne la réponse de Jonathan Leffer, un traitement complet des types de colonnes et des détails de colonnes devient compliqué comme on peut le voir dans le SYSCOLUMNS documentation. Mais si vous regardez la base de données sans utiliser des types plus compliqués, cet ajout à son script montrera le type de base et si NULLs sont autorisés:

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;
1
répondu Stephen Klancher 2017-05-11 02:20:09