Как узнать тип поля?

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
jenya7
Сообщения: 16
Зарегистрирован: 07 окт 2005, 12:26

Как узнать тип поля?

Сообщение jenya7 » 27 апр 2006, 16:56

Привет всем!

Как узнать тип поля для данной таблицы в запросе?

Заранее спасибо!

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 27 апр 2006, 17:16

через системные таблицы. кроме того, после prepare тип выходных столбцов сообщается сервером клиенту.

jenya7
Сообщения: 16
Зарегистрирован: 07 окт 2005, 12:26

Сообщение jenya7 » 27 апр 2006, 23:20

то есть чтобы узнать тип одного поля в данной таблице я должен
создать запрос
SELECT R.RDB$RELATION_NAME, R.RDB$FIELD_NAME, F.RDB$FIELD_TYPE, F.RDB$FIELD_SCALE
FROM RDB$FIELDS F, RDB$RELATION_FIELDS R
WHERE F.RDB$FIELD_NAME = 'MyFieldName' AND R.RDB$RELATION_NAME = 'MyTableName' AND R.RDB$SYSTEM_FLAG = 0
где MyFieldName,MyTableName переменные типа String

я прав?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 28 апр 2006, 08:31

Не совсем. Во-первых, имена надо писать большими буквами (если только они у тебя не регистрочувствительные), а во-вторых - читай вторую часть фразы kdv: кроме того, после prepare тип выходных столбцов сообщается сервером клиенту.
Ответы могли бы быть точнее если бы ты сообщил нам когда и зачем тебе нужен тип поля. Я как-то сходу не могу придумать такую задачу...

Dmitry Beloshistov
Сообщения: 41
Зарегистрирован: 27 окт 2004, 11:06

Сообщение Dmitry Beloshistov » 28 апр 2006, 09:52

Dimitry Sibiryakov писал(а): Ответы могли бы быть точнее если бы ты сообщил нам когда и зачем тебе нужен тип поля. Я как-то сходу не могу придумать такую задачу...
Навскидку - универсальная форма для ввода параметров ХП или форма, редактирующая одну запись в табличке. (Развивая мысль - если тип поля блоб - нужно предусмотреть возможность Load/Save в файл и т.п.)

jenya7
Сообщения: 16
Зарегистрирован: 07 окт 2005, 12:26

Сообщение jenya7 » 28 апр 2006, 09:54

мне нужна функция возвращающая тип поля для дальнейшей работы
с ним. что то вроде этого

Код: Выделить всё

Function GetFieldType(TableName,FieldName: String): TFieldType;
Var
  ExecQuery  : TQuery;
  ExecQuery1 : TQuery;
  FieldScale : Integer;

Begin
 GetFieldType := ftString;
 ExecQuery := TQuery.Create(Nil);
 ExecQuery.DatabaseName :=MainAlias 
 // for INTERBASE !!!
 ExecQuery.SQL.Add('SELECT R.RDB$RELATION_NAME,   R.RDB$FIELD_POSITION, R.RDB$FIELD_NAME,');
 ExecQuery.SQL.Add('F.RDB$FIELD_TYPE, F.RDB$FIELD_SCALE ');
 ExecQuery.SQL.Add('FROM RDB$FIELDS F, RDB$RELATION_FIELDS R ');
 ExecQuery.SQL.Add('WHERE R.RDB$RELATION_NAME ='+''''+TableName+''''+   'AND F.RDB$FIELD_NAME = R.RDB$FIELD_SOURCE AND R.RDB$SYSTEM_FLAG = 0 ');

  // for ORACLE !!!
 {ExecQuery.SQL.Add('SELECT DATA_TYPE FROM USER_TAB_COLUMNS WHERE TABLE_NAME = '+''''+TableName+''''+
                   ' AND COLUMN_NAME = '+''''+FieldName+''''); }

 ExecQuery.Open;
 If ExecQuery.FieldByName('RDB$FIELD_TYPE').AsString = 'VARCHAR' Then
  GetFieldType := ftString
 Else
 If ExecQuery.FieldByName('RDB$FIELD_TYPE').AsString = 'NUMBER' Then
  Begin { FOR SCALING FIELD}
   ExecQuery1 := TQuery.Create(Nil);
   ExecQuery1.DatabaseName := MainAlias 
 ExecQuery1.SQL.Add('SELECT R.RDB$RELATION_NAME,   R.RDB$FIELD_POSITION, R.RDB$FIELD_NAME,');
 ExecQuery1.SQL.Add('F.RDB$FIELD_TYPE, F.RDB$FIELD_SCALE AS YYY ');
 ExecQuery1.SQL.Add('FROM RDB$FIELDS F, RDB$RELATION_FIELDS R ');
 ExecQuery1.SQL.Add('WHERE R.RDB$RELATION_NAME ='+''''+TableName+''''+   'AND F.RDB$FIELD_NAME = R.RDB$FIELD_SOURCE AND R.RDB$SYSTEM_FLAG = 0 ');
   ExecQuery1.Open;
   FieldScale:=ExecQuery1.FieldByName('YYY').AsInteger;
   IF FieldScale = 0 then
    GetFieldType := ftInteger
   Else
    GetFieldType := ftFloat;

   ExecQuery1.Close;
   ExecQuery1.Free;
  End
 Else
 If ExecQuery.FieldByName('RDB$FIELD_TYPE').AsString = 'TIMESTAMP'  Then
  GetFieldType := ftDateTime;
 ExecQuery.Close;
 ExecQuery.Free;
End;
вопрос как мне достучаться до определенного поля! т.е. передать параметр FieldName как я делал в примере для оракла , приведенном выше.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 28 апр 2006, 10:43

есть системные таблицы, есть документ
www.ibase.ru/devinfo/sysqry.htm

что тебе еще надо??? код за тебя написать?

jenya7
Сообщения: 16
Зарегистрирован: 07 окт 2005, 12:26

Сообщение jenya7 » 28 апр 2006, 11:45

Дружище!!! Не надо код!!! Одну строчку!!! One fucking line!!!
у тебя в запросе

where F.RDB$FIELD_NAME = R.RDB$FIELD_SOURCE and RDB$RELATION_NAME = 'MYTABLE'.

это чтоб выбрать ВСЕ поля. а как выбрать ОДНО КОНКРЕТНОЕ поле?
where F.RDB$FIELD_NAME = ???

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 28 апр 2006, 12:02

нет, я в таких случаях не помогаю. если у тебя с SQL проблемы, то ты как-нибудь сам, или разберись, или забей.

jenya7
Сообщения: 16
Зарегистрирован: 07 окт 2005, 12:26

Сообщение jenya7 » 28 апр 2006, 12:05

нашел.
запрос по ОДНОМУ полю в таблице

select R.RDB$RELATION_NAME, R.RDB$FIELD_NAME,
F.RDB$FIELD_TYPE, F.RDB$FIELD_SCALE

from RDB$FIELDS F, RDB$RELATION_FIELDS R

where R.RDB$FIELD_SOURCE = 'MyFieldName' and R.RDB$RELATION_NAME = 'MYTABLE' and R.RDB$SYSTEM_FLAG = 0

order by R.RDB$RELATION_NAME, R.RDB$FIELD_POSITION

спасибо за помощь.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 28 апр 2006, 12:49

order by тут не нужен, раз одну запись вынимаешь.
кроме того, where некорректный.
В том смысле, что ты так и не понял, что находится в rdb$relations:

rdb$field_name - ИМЯ СТОЛБЦА В ТАБЛИЦЕ
rdb$field_source - имя "домена", который является источником для столбца, из rdb$fields.

и, разумеется, таблицы rdb$fields и rdb$relation_fields надо связать по имени field_source.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 28 апр 2006, 12:57

А всё таки интересно - бриться газонокосилкой и трахаться стоя в гамаке - это религия? Сделать prepare целевому компоненту и посмотреть TField.DataType или TParam.DataType - воисстину не кошерно?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 28 апр 2006, 13:15

У ораклоидов еще и не такое бывает...

jenya7
Сообщения: 16
Зарегистрирован: 07 окт 2005, 12:26

Сообщение jenya7 » 28 апр 2006, 17:31

спасибо за корректировку!

jenya7
Сообщения: 16
Зарегистрирован: 07 окт 2005, 12:26

Сообщение jenya7 » 28 апр 2006, 21:40

и действительно - все решаеться очень просто

Function GetFieldType(TableName,FieldName: String): TFieldType;
Var
ExecQuery : TQuery;
Begin
GetFieldType := ftString;
ExecQuery := TQuery.Create(Nil);
ExecQuery.DatabaseName :=MainAlias;

ExecQuery.SQL.Add('SELECT * FROM ' + TableName);
ExecQuery.Prepare;
ExecQuery.Open;
GetFieldType := ExecQuery.FieldByName(FieldName).DataType;
end;

jenya7
Сообщения: 16
Зарегистрирован: 07 окт 2005, 12:26

Сообщение jenya7 » 28 апр 2006, 21:58

раз пошла такая пьянка хочу задать еще один вопрос

можно ли получить Primary Index Name через тот же Prepare.
если нет то как это сделать через системные таблицы (кстати это возможность дополнить прекрасный документ www.ibase.ru/devinfo/sysqry.htm )

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 29 апр 2006, 10:38

дополнять тут нечего. есть системные таблицы, в которых все просто, есть описание langref.pdf, и т.п.

через prepare первичный ключ не получить. первичный ключ можно получить через системные таблицы.

чувствуется, велосипед какой-то ты изобретаешь. нет?

jenya7
Сообщения: 16
Зарегистрирован: 07 окт 2005, 12:26

Сообщение jenya7 » 29 апр 2006, 11:57

ну почему велосипед? мне нужна функция извлекающяя тип поля и первичный ключ для дальнейшей работы с ними. там довольно сложный алгоритм , в двух словах не объяснишь.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 29 апр 2006, 22:17

два раза писал ответ, и оба раза стирал - все какая то гадость получается.
Учись, короче. Не знаю, какие у тебя там сложные алгоритмы. Ты пока с трудом модифицируешь примитивный запрос для своих целей....

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 02 май 2006, 08:17

Где-то на сайте была статья "полезные запросы к системным таблицам"...

Ответить