Условное преобразование типа данных столбца из числа с плавающей точкой в ​​значение двойной точности

Я переработал свою базу данных SQL на базе Firebird. В рамках этого процесса я создал новую таблицу с именем HARMONICS. Используя инструмент администрирования на основе графического интерфейса, я создал следующие столбцы:

HARM_LP_ID Integer NOT NULL
HNUMBER Integer NOT NULL
HAMPCHNL0 Double precision
HAMPCHNL1 Double precision
HAMPCHNL2 Double precision
HAMPCHNL3 Double precision
HAMPCHNL4 Double precision
HAMPCHNL5 Double precision
HPHCHNL0 Double precision
HPHCHNL1 Double precision
HPHCHNL2 Double precision
HPHCHNL3 Double precision
HPHCHNL4 Double precision
HPHCHNL5 Double precision

После этого я вставил в новые сущности некоторые тестовые данные. Изменения коснулись и других таблиц, но они не связаны с моей проблемой, поэтому я не буду их здесь перечислять. Затем я настроил свое приложение для работы с новой структурой реляционной базы данных.

Когда приложение было полностью протестировано, я улучшил утилиту под названием Upgrader. Задача Upgrader - конвертировать между различными версиями баз данных SQL. Для выполнения этой задачи я написал сценарий SQL. Следуя ошибочным руководствам на официальном сайте Firebird (http://firebirdsql.org/manual/migration-mssql-data-types.html) Я написал следующую команду для создания вышеупомянутой таблицы:

CREATE TABLE HARMONICS
(
  HARM_LP_ID Integer NOT NULL,
  HNUMBER Integer NOT NULL,
  HAMPCHNL0 Float,
  HAMPCHNL1 Float,
  HAMPCHNL2 Float,
  HAMPCHNL3 Float,
  HAMPCHNL4 Float,
  HAMPCHNL5 Float,
  HPHCHNL0 Float,
  HPHCHNL1 Float,
  HPHCHNL2 Float,
  HPHCHNL3 Float,
  HPHCHNL4 Float,
  HPHCHNL5 Float,
  CONSTRAINT PKHARMONICS1 PRIMARY KEY (HARM_LP_ID,HNUMBER)
);

Я думал, что тип данных Firebird «Float» - это float двойной точности (то же, что и тип данных «double» в C). В конце концов я обнаружил, что ошибался, но это было после того, как я создал официальный выпуск утилиты Upgrader. Итак, теперь у меня в обращении есть две версии баз данных - одна с числами с плавающей запятой одинарной точности и вторая с числами с плавающей запятой двойной точности.

Я ищу сценарий SQL, который проверяет фактический тип данных столбцов в таблице HARMONICS. Если это двойная точность, скрипт ничего не сделает. Если это одинарная точность, скрипт преобразует столбцы с типом данных «Float» в «Double precision» с сохранением всех существующих данных. Дело в том, что скрипт в любом случае не вернет ошибку. Это возможно? Если да, то как?


person truthseeker    schedule 15.02.2012    source источник


Ответы (1)


Вы можете проверить фактический тип столбца, используя следующий запрос

SET TERM ^ ;
EXECUTE BLOCK AS BEGIN
  if (exists(select
    rf.rdb$field_name,
    f.rdb$field_type
    from
      rdb$fields f join rdb$relation_fields rf
      on rf.rdb$field_source = f.rdb$field_name
    where
      rf.rdb$relation_name = 'YOUR_TABLE_NAME'
      AND rf.rdb$field_name = 'YOUR_FIELD_NAME'
      AND f.RDB$FIELD_TYPE = 10)) then
  execute statement 'ALTER TABLE YOUR_TABLE_NAME ALTER YOUR_FIELD_NAME TYPE DOUBLE    PRECISION';
END^
SET TERM ; ^

rdb $ field_type для FLOAT - 10, для DOUBLE PRECISION - 27.

person Andrej Kirejeŭ    schedule 15.02.2012
comment
Концепция правильная (+1 балл), но я бы расширил эти команды, используя if clausule. Я успешно проверил, что все мои требования могут быть выполнены с помощью чистого скрипта sql (без логики, написанной на более высоком языке программирования). - person truthseeker; 15.02.2012
comment
Поместите код в оператор EXECUTE BLOCK с командами EXECUTE STATEMENT. - person Andrej Kirejeŭ; 15.02.2012