Informix SQL-Список всех полей и таблиц
Informix iSQL имеет команду"info tables;
" Что показывает все таблицы.
Синтаксис для просмотра полей и соответствующих типов данных:"info columns for table;
"
есть ли аналогичная команда, которая показывает таблицу.поля для всех таблиц и всех полей?
3 ответов
использование предпочтительного обозначения соединения:
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;
предполагая, что вы используете достаточно последнюю версию идентификаторов, вы можете заказать по столбцам, не указанным в списке выбора. Если вы получаете жалобы, добавьте столбцы заказа в список выбора.
критерий соединения очевиден; tabtype = ' T ' перечисляет только таблицы, а не представления, синонимы и другие подобные элементы, перечисленные в системных таблицах; tabid >= 100 только таблицы, списки, созданные явно в базе данных, а не в системном каталоге.
это не включает в себя информацию о типе - если вы этого хотите, вам нужно сделать немного больше работы. Вы найдете файл $INFORMIXDIR/etc/xpg4_is.sql
который содержит грубое приближение к старой версии информационной схемы XPG4 (X/Open standard) (отсюда и имя файла). Там есть функции и для декодирования информации типа syscolumns.coltype
и syscolumns.collength
в узнаваемых строк. Однако, я сильно подозреваю, что не обрабатывает отдельные типы и другие определяемые пользователем типы. Я буду рад, если окажется, что я ошибаюсь, но ... .. Если вы добавите соответствующие части этого файла в свою базу данных, вы также сможете получить информацию о типе.
также обратите внимание, что все команды INFO В ISQL и DB-Access моделируются в интерфейсе, а не выполняются на сервере IDS. В принципе, программы принимают запрос и преобразуют его в более сложную инструкцию SQL. Смотрите код в файле sqlinfo.ec
это часть программы SQLCMD (доступна из в архиве программного обеспечения) как моя программа sqlcmd обработки данных отчетности. (Примечание: информационный выход SQLCMD отформатирован иначе, чем информационный выход ISQL и DB-Access.)
используйте таблицу syscolumns. Такая информация описана в IBM Informix Guide to SQL
Я сделал простые утилиты Python, которые показывают информацию о схеме для Informix, Oracle и PostgreSQL. Они полезны, если вам нужно сравнить базы данных.
Как упоминает ответ Джонатана Леффера, полная обработка типов столбцов и деталей столбцов усложняется, как видно из SYSCOLUMNS документация. Но если вы смотрите на базу данных, не используя более сложные типы, это дополнение к его скрипту покажет базовый тип и разрешены ли нули:
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;