powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / структура таблицы
8 сообщений из 8, страница 1 из 1
структура таблицы
    #33356519
Demidov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, не подскажите какой запрос вернёт мне структуру таблицы в Informixe?
...
Рейтинг: 0 / 0
структура таблицы
    #33356547
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DemidovГоспода, не подскажите какой запрос вернёт мне структуру таблицы в Informixe?
Такого запроса нет. Можно попробовать список полей типов данных получить, но правильно и всю вернет только команда dbschema .
...
Рейтинг: 0 / 0
структура таблицы
    #33358034
Leonid Vorontsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В принципе, всё можно найти в таблицах системного каталога. Так что, я думаю, нет ничего невозможного для человека с интеллектом. Вот, даю на доработку начальный набор процедур. Там не так уж и много осталось доделать (для 7-ки) - имя и тип колонок уже есть, осталось - DEFAULT, NULL, UNIQUE, PRIMARY KEY, REFERENCES, CHECK и INDEX. Конечно, тут могут быть глюки - поэтому все призываются к тестированию и доработке.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
-- DROP PROCEDURE get_precision;
CREATE PROCEDURE get_precision( iColLength INT ) RETURNING CHAR( 300 );
	DEFINE iPrecision INT;
	IF iColLength >= 256 THEN
		LET iPrecision = iColLength / 256;
		IF iColLength - iPrecision * 256 = 255 THEN
			RETURN iPrecision;
		ELSE
			RETURN iPrecision || ', ' || iColLength - iPrecision * 256;
		END IF;
	ELSE
		RETURN iColLength;
	END IF;
END PROCEDURE;

-- DROP PROCEDURE get_qualifier;
CREATE PROCEDURE get_qualifier( iCode INT ) RETURNING CHAR( 300 );
	IF iCode = 0 THEN RETURN 'YEAR';
	ELIF iCode = 2 THEN RETURN 'MONTH';
	ELIF iCode = 4 THEN RETURN 'DAY';
	ELIF iCode = 8 THEN RETURN 'MINUTE';
	ELIF iCode = 10 THEN RETURN 'SECOND';
	ELIF iCode = 11 THEN RETURN 'FRACTION( 1 )';
	ELIF iCode = 12 THEN RETURN 'FRACTION( 2 )';
	ELIF iCode = 13 THEN RETURN 'FRACTION( 3 )';
	ELIF iCode = 14 THEN RETURN 'FRACTION( 4 )';
	ELIF iCode = 15 THEN RETURN 'FRACTION( 5 )';
	ELSE RETURN '???';
	END IF;
END PROCEDURE;

-- DROP PROCEDURE get_from_to;
CREATE PROCEDURE get_from_to( iColLength INT ) RETURNING CHAR( 300 );
	DEFINE iLen, iFrom, iTo INT;
	DEFINE cFromTo CHAR( 300 );
	LET iLen = iColLength / 256;
	LET iFrom = ( iColLength - iLen * 256 ) / 16;
	LET iTo = iColLength - iLen * 256 - iFrom * 16;
	LET cFromTo = get_qualifier( iFrom );
	RETURN SUBSTR( cFromTo, 1, LENGTH( cFromTo ) ) || ' TO ' || get_qualifier( iTo );
END PROCEDURE;

-- DROP PROCEDURE get_reserve;
CREATE  PROCEDURE get_reserve( iColLength INT ) RETURNING CHAR( 300 );
	DEFINE iPrecision INT;
	IF iColLength >= 256 THEN
		LET iPrecision = iColLength / 256;
		RETURN iColLength - iPrecision * 256 || ', ' || iPrecision;
	ELSE
		RETURN iColLength;
	END IF;
END PROCEDURE;

-- DROP PROCEDURE get_tab_def;
CREATE PROCEDURE get_tab_def( cTabName CHAR( 18 ) ) RETURNING CHAR( 32000 );
	DEFINE iColNo, iColType, iColLength INT;
	DEFINE cColName CHAR( 18 );
	DEFINE cCrLf CHAR( 2 );
	DEFINE cCreateTable CHAR( 32000 );
	DEFINE cPrecision, cFromTo, cReserve CHAR( 300 );
	SELECT data[ 69, 70 ] INTO cCrLf FROM sysprocbody WHERE datakey = 'T' AND procid = 1 AND seqno = 1;
	LET cCreateTable = 'CREATE TABLE ' || SUBSTR( cTabName, 1, LENGTH( cTabName ) ) || ' (' || cCrLf;
	FOREACH
		SELECT colno, colname, coltype, collength INTO iColNo, cColName, iColType, iColLength
		FROM systables t, syscolumns c WHERE t.tabid = c.tabid AND t.tabname = cTabName ORDER BY 1
		LET cCreateTable = SUBSTR( cCreateTable, 1, LENGTH( cCreateTable ) ) || '	' || cColName || '*';
		IF iColType IN ( 0, 256 ) THEN LET cCreateTable = SUBSTR( cCreateTable, 1, LENGTH( cCreateTable ) -1 ) || '	CHAR( ' || iColLength || ' ),' || cCrLf;
		ELIF iColType IN ( 1, 257 ) THEN LET cCreateTable = SUBSTR( cCreateTable, 1, LENGTH( cCreateTable ) -1 ) || '	SMALLINT,' || cCrLf;
		ELIF iColType IN ( 2, 258 ) THEN LET cCreateTable = SUBSTR( cCreateTable, 1, LENGTH( cCreateTable ) -1 ) || '	INTEGER,' || cCrLf;
		ELIF iColType IN ( 3, 259 ) THEN LET cCreateTable = SUBSTR( cCreateTable, 1, LENGTH( cCreateTable ) -1 ) || '	FLOAT,' || cCrLf;
		ELIF iColType IN ( 4, 260 ) THEN LET cCreateTable = SUBSTR( cCreateTable, 1, LENGTH( cCreateTable ) -1 ) || '	SMALLFLOAT,' || cCrLf;
		ELIF iColType IN ( 5, 261 ) THEN
			LET cPrecision = get_precision( iColLength );
			LET cCreateTable = SUBSTR( cCreateTable, 1, LENGTH( cCreateTable ) -1 ) || '	DECIMAL( ' || SUBSTR( cPrecision, 1, LENGTH( cPrecision ) ) || ' ),' || cCrLf;
		ELIF iColType IN ( 6, 262 ) THEN LET cCreateTable = SUBSTR( cCreateTable, 1, LENGTH( cCreateTable ) -1 ) || '	SERIAL,' || cCrLf;
		ELIF iColType IN ( 7, 263 ) THEN LET cCreateTable = SUBSTR( cCreateTable, 1, LENGTH( cCreateTable ) -1 ) || '	DATE,' || cCrLf;
		ELIF iColType IN ( 8, 264 ) THEN
			LET cPrecision = get_precision( iColLength );
			LET cCreateTable = SUBSTR( cCreateTable, 1, LENGTH( cCreateTable ) -1 ) || '	MONEY( ' || SUBSTR( cPrecision, 1, LENGTH( cPrecision ) ) || ' ),' || cCrLf;
		ELIF iColType IN ( 10, 266 ) THEN
			LET cFromTo = get_from_to( iColLength );
			LET cCreateTable = SUBSTR( cCreateTable, 1, LENGTH( cCreateTable ) -1 ) || '	DATETIME ' || SUBSTR( cFromTo, 1, LENGTH( cFromTo ) ) || ',' || cCrLf;
		ELIF iColType IN ( 11, 267 ) THEN LET cCreateTable = SUBSTR( cCreateTable, 1, LENGTH( cCreateTable ) -1 ) || '	BYTE,' || cCrLf;
		ELIF iColType IN ( 12, 268 ) THEN LET cCreateTable = SUBSTR( cCreateTable, 1, LENGTH( cCreateTable ) -1 ) || '	TEXT,' || cCrLf;
		ELIF iColType IN ( 13, 269 ) THEN
			LET cReserve = get_reserve( iColLength );
			LET cCreateTable = SUBSTR( cCreateTable, 1, LENGTH( cCreateTable ) -1 ) || '	VARCHAR( ' || SUBSTR( cReserve, 1, LENGTH( cReserve ) ) || ' ),' || cCrLf;
		ELIF iColType IN ( 14, 270 ) THEN
			LET cFromTo = get_from_to( iColLength );
			LET cCreateTable = SUBSTR( cCreateTable, 1, LENGTH( cCreateTable ) -1 ) || '	INTERVAL ' || SUBSTR( cFromTo, 1, LENGTH( cFromTo ) ) || ',' || cCrLf;
		ELIF iColType IN ( 15, 271 ) THEN LET cCreateTable = SUBSTR( cCreateTable, 1, LENGTH( cCreateTable ) -1 ) || '	NCHAR( ' || iColLength || ' ),' || cCrLf;
		ELIF iColType IN ( 16, 272 ) THEN
			LET cReserve = get_reserve( iColLength );
			LET cCreateTable = SUBSTR( cCreateTable, 1, LENGTH( cCreateTable ) -1 ) || '	NVARCHAR( ' || SUBSTR( cReserve, 1, LENGTH( cReserve ) ) || ' ),' || cCrLf;
		ELSE LET cCreateTable = SUBSTR( cCreateTable, 1, LENGTH( cCreateTable ) -1 ) || '	???' || cCrLf;
		END IF;
	END FOREACH;
	RETURN SUBSTR( cCreateTable, 1, LENGTH( cCreateTable ) - 3 ) || cCrLf || ');';
END PROCEDURE;
...
Рейтинг: 0 / 0
структура таблицы
    #33358051
Leonid Vorontsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гм, все сдвиги пропали... Пошлю-ка я то же самое в виде файла - красивее будет.
...
Рейтинг: 0 / 0
структура таблицы
    #33358061
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid VorontsovГм, все сдвиги пропали... Пошлю-ка я то же самое в виде файла - красивее будет.
тег fixed используй.
...
Рейтинг: 0 / 0
структура таблицы
    #33359679
В.К.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А одним запросом имя столбца, тип (правильный), признак PK, признак NULL и значение по умолчанию слабо?
...
Рейтинг: 0 / 0
структура таблицы
    #33372799
Leonid Vorontsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ку-ку! А чего так тихо-то? Хоть кто-нибудь оценил мои старания? И, кстати, ошибочка нашлась - в RETURN надо 3 на 2 поменять. Иначе, последняя буква названия типа последней колнки подрезается.
...
Рейтинг: 0 / 0
структура таблицы
    #33373906
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid VorontsovКу-ку! А чего так тихо-то? Хоть кто-нибудь оценил мои старания?
МОЛОДЕЦ! СУПЕР! :)
Я, к примеру, пока не попробовал и не потестировал (не до того было, да и необходимости такой сейчас нет), а когда то мы все пробовали такое написать или что то похожее, но ...тоже никто не оценил :) Я к этому отношусь уже философски, т.е. с пониманием, в душе надеясь, как и многие из здесь помогающих, что кому то это принесет пользу. А если человек даже спасибо не сказал - то ему было просто некогда (или воспитание не позволило).
Так что не обижайся и не жди благодарностей - когда нибудь это тебе зачтется :)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Informix [игнор отключен] [закрыт для гостей] / структура таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]