Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Informix [игнор отключен] [закрыт для гостей] / структура таблицы / 8 сообщений из 8, страница 1 из 1
02.11.2005, 08:25
    #33356519
Demidov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
структура таблицы
Господа, не подскажите какой запрос вернёт мне структуру таблицы в Informixe?
...
Рейтинг: 0 / 0
02.11.2005, 08:42
    #33356547
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
структура таблицы
DemidovГоспода, не подскажите какой запрос вернёт мне структуру таблицы в Informixe?
Такого запроса нет. Можно попробовать список полей типов данных получить, но правильно и всю вернет только команда dbschema .
...
Рейтинг: 0 / 0
02.11.2005, 15:58
    #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
02.11.2005, 16:02
    #33358051
Leonid Vorontsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
структура таблицы
Гм, все сдвиги пропали... Пошлю-ка я то же самое в виде файла - красивее будет.
...
Рейтинг: 0 / 0
02.11.2005, 16:06
    #33358061
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
структура таблицы
Leonid VorontsovГм, все сдвиги пропали... Пошлю-ка я то же самое в виде файла - красивее будет.
тег fixed используй.
...
Рейтинг: 0 / 0
03.11.2005, 12:00
    #33359679
В.К.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
структура таблицы
А одним запросом имя столбца, тип (правильный), признак PK, признак NULL и значение по умолчанию слабо?
...
Рейтинг: 0 / 0
11.11.2005, 10:30
    #33372799
Leonid Vorontsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
структура таблицы
Ку-ку! А чего так тихо-то? Хоть кто-нибудь оценил мои старания? И, кстати, ошибочка нашлась - в RETURN надо 3 на 2 поменять. Иначе, последняя буква названия типа последней колнки подрезается.
...
Рейтинг: 0 / 0
11.11.2005, 15:07
    #33373906
vasilis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
структура таблицы
Leonid VorontsovКу-ку! А чего так тихо-то? Хоть кто-нибудь оценил мои старания?
МОЛОДЕЦ! СУПЕР! :)
Я, к примеру, пока не попробовал и не потестировал (не до того было, да и необходимости такой сейчас нет), а когда то мы все пробовали такое написать или что то похожее, но ...тоже никто не оценил :) Я к этому отношусь уже философски, т.е. с пониманием, в душе надеясь, как и многие из здесь помогающих, что кому то это принесет пользу. А если человек даже спасибо не сказал - то ему было просто некогда (или воспитание не позволило).
Так что не обижайся и не жди благодарностей - когда нибудь это тебе зачтется :)
...
Рейтинг: 0 / 0
Форумы / Informix [игнор отключен] [закрыт для гостей] / структура таблицы / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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