web-dev-qa-db-fra.com

Informix SQL - Liste tous les champs et tables

Informix iSQL dispose d'une commande "info tables; "qui affiche toutes les tables.
La syntaxe d'affichage des champs et de leurs types de données respectifs est "info columns for table; "

Existe-t-il une commande similaire qui affiche table.field pour toutes les tables et tous les champs?

18
CheeseConQueso

Utilisation de la notation JOIN 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 la notation de clause join-in-where à l'ancienne:

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 classer par colonnes non citées dans la liste de sélection. Si vous recevez des réclamations, ajoutez les colonnes de commande à la liste de sélection.

Le critère de jointure est évident; le tabtype = 'T' répertorie uniquement les tableaux, pas les vues, les synonymes et autres éléments de ce type répertoriés dans systables; le tabid> = 100 répertorie uniquement les tables créées explicitement dans la base de données, pas le catalogue système.

Cela n'inclut pas les informations de type - si vous le souhaitez, 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 (standard X/Open) (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 chaînes reconnaissables. Cependant, je soupçonne fortement qu'il ne gère pas les types DISTINCT, ni les autres types définis par l'utilisateur. Je serai ravi de me tromper, mais ... Si vous ajoutez les parties pertinentes de ce fichier à votre base de données, vous devriez également pouvoir obtenir les informations de type.

Notez également que toutes les commandes INFO dans ISQL et DB-Access sont simulées dans le frontal, et non exécutées dans le serveur IDS. Fondamentalement, les programmes prennent la demande et la convertissent en une instruction SQL plus complexe. Voir le code dans le fichier sqlinfo.ec qui fait partie de SQLCMD (disponible sur IIUG Software Archive ) pour savoir comment mon programme SQLCMD gère les instructions INFO. (Remarque: la sortie INFO de SQLCMD est formatée différemment de la sortie INFO d'ISQL et de DB-Access.)

32
Jonathan Leffler

Comme le mentionne la réponse de Jonathan Leffer, une gestion complète des types de colonnes et des détails des colonnes se complique comme on peut le voir dans la documentation SYSCOLUMNS . Mais si vous regardez une base de données n'utilisant pas de types plus compliqués, cet ajout à son script montrera le type de base et si les NULL 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
Stephen Klancher

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

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

1
Michał Niklas