2007/4/25 更新
Zope + ZODBCDA + JET DB(MS Accesss)から、Zope + KInterbaseDA + Firebird 1.0.3 に RDBを移行した時のメモです。
(2007/4/25 追記 Firebird 2.0 以降ではできるみたいです)
例えば
| SELECT A.a1, A.a2, B.b1 FROM A, B |
の、A B の代わりに SELECT 文を置けません。以下が、ダメな例です。
| SELECT A.a1, A.a2, B.b1 FROM A, (SELECT c.b1, c.b2 FROM C WHERE c.foo='bar') B |
同様に、以下の例もエラーになりました。
| SELECT A.a1, A.a2, B.b1 FROM A LEFT JOIN (SELECT c.b1, c.b2 FROM C WHERE c.foo='bar') B ON A.a1 = B.b1 |
しかし、A、B、Cが表名(or View名)であれば、以下のような INNER JOIN と OUTER JOIN の組み合わせは記述できます。
| SELECT A.a1, B.b1, C.c1 FROM A, B LEFT JOIN C ON B.w = C.x WHERE A.y = B.z |
KInterbase DA では、<dtml-var sql_delimiter> で区切って、複数の SQL文を1つの ZSQLMethod で実行することができませんでした。
Firebird では、表名、列名に User、 Value、 Password が使えませんでした。
JET DB では、SQL文に記述する日付式は #YYYY/MM/DD# ですが、Firebird では 'YYYY-MM-DD' と書きます。
日付型のデータを SELECT し、<dtml-var datevalue> と DTMLに書くと JET DB では、2003/06/14 と表示されますが、Firebird では 2003-06-14 13:00:00.00 とレンダリングされてしまいます。
以下のような PythonScriptを書き、DTML に <dtml-var "date_to_string(datevalue)"> と記述することにより、日付部分のみを表示するようにしました。
| ScriptName: date_to_string Parameter List: date |
|
|
JET DBでは、オートナンバー型という、行を挿入するごとに自動採番される列を指定することができますが、Firebird では、トリガーとジェネレーターで同様のことがなされるようにできます。
具体的には、以下のような SQL文で、表 same_table の列 some_id が、自動的に 10000から採番されます。
| create generator gen_some_id; set generator gen_some_id to 10000; set term !! ; create trigger set_some_id for some_table before insert as begin new.some_id = gen_id(gen_some_id,1); end !! set term ; !! |