2012-02-15 14 views
1

FirebirdベースのSQLデータベースを再設計しました。このプロセスの一環として、HARMONICSという新しいテーブルを作成しました。 GUIベースの管理ツールを使用して、私は次の列を作成しました:Firebird 2.5 - 列データ型をfloatから倍精度に条件付きで変換します

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のデータ型「フロート」は倍精度浮動小数点(でのデータ型「ダブル」と同じであると考え

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のサイト(http://firebirdsql.org/manual/migration-mssql-data-types.html)を上の誤ったガイドに続いて、私は上記の表を作成するためのコマンドを次のように書きましたC)。私は最終的に私が間違っていることが分かったが、これは私がUpgraderユーティリティの公式リリースを作成した後であった。ですから、私は現在、2つのバージョンのデータベースを流通させています.1つは単精度浮動小数点数で、もう1つは倍精度浮動小数点数です。 テーブルHARMONICSのカラムの実際のデータタイプをチェックするSQLスクリプトを探しています。これが倍精度の場合、スクリプトは何も行いません。これが単精度の場合、スクリプトはデータ型が "Float"の列を既存のすべてのデータを保存して "倍精度"に変換します。ポイントはどちらの場合でもスクリプトがエラーを返さないということです。これは可能ですか?はいの場合はどうですか?あなたは、次のクエリを使用して、列の実際の型

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 ;^

がFLOATのためのRDBの$のfield_typeはDOUBLE PRECISIONのために、10で確認することができ

答えて

4

は27

+0

コンセプトが正しい(その1ポイント)であるが、 if clausuleを使ってこれらのコマンドを拡張します。私は正常にすべての私の要件は、純粋なSQLスクリプト(高いプログラミング言語で書かれたロジックなし)で完全にテストすることができます。 – truthseeker

+0

EXECUTE STATEMENTコマンドを使用して、EXECUTE BLOCKステートメント内にコードを挿入します。 –

+0

あなたの回答を編集しました。 – truthseeker

関連する問題