Informix SQL - список всех полей и таблиц

Informix iSQL имеет команду "info tables;", которая отображает все таблицы.
Синтаксис для просмотра полей и их соответствующих типов данных "info columns for table;"

Есть ли аналогичная команда, которая показывает table.field для всех таблиц и всех полей?

Ответы

Ответ 1

Использование предпочтительной записи JOIN:

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;

или старомодное обозначение join-in-where-clause:

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;

Предполагая, что вы используете достаточно недавнюю версию IDS, вы можете заказать по столбцам, не указанным в списке выбора. Если вы получаете жалобы, добавьте столбцы упорядочения в список выбора.

Критерий соединения очевиден; tabtpe = 'T' перечисляет только таблицы, а не представления, синонимы и другие подобные элементы, перечисленные в systables; tabid >= 100 отображает только таблицы, созданные явно в базе данных, а не в системном каталоге.

Это не включает информацию о типе - если вы этого хотите, вам нужно немного поработать. Вы найдете файл $INFORMIXDIR/etc/xpg4_is.sql, который содержит грубое приближение к старой версии информационной системы XPG4 (X/Open standard) (отсюда и название файла). Там есть функции и т.д., Чтобы декодировать информацию типа из syscolumns.coltype и syscolumns.collength в распознаваемые строки. Тем не менее, я сильно подозреваю, что он не обрабатывает типы DISTINCT, а также другие пользовательские типы. Я буду рад оказаться ошибочным, но... Если вы добавите соответствующие части этого файла в свою базу данных, вы также сможете получить информацию о типе.

Также обратите внимание, что все команды INFO в ISQL и DB-Access моделируются в интерфейсе, а не выполняются на сервере IDS. В основном, программы принимают запрос и преобразуют его в более сложный оператор SQL. См. Код в файле sqlinfo.ec, который является частью SQLCMD (доступный из Архив программного обеспечения IIUG), как моя программа SQLCMD обрабатывает инструкции INFO. (Примечание: вывод INFO SQLCMD отличается от вывода INFO ISQL и DB-Access.)

Ответ 2

Используйте таблицу syscolumns. Такая информация описана в Руководство IBM Informix по SQL

Я сделал простые утилиты Python, которые отображают информацию о схеме для Informix, Oracle и PostgreSQL. Они полезны, если вам нужно сравнивать базы данных.

Ответ 3

Как упоминает Джонатан Леффер, полная обработка типов столбцов и деталей столбца усложняется, как видно из документации SYSCOLUMNS. Но если вы смотрите на базу данных, не использующую более сложные типы, это дополнение к его script покажет основной тип и допустимы ли 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;