依存関係

Derby は準備済み文の依存関係を追跡します。準備済み文とは実行前にコンパイルされたSQL文の事です。典型的なシナリオとして、これらは準備(プレコンパイル)された後、複数回実行されます。

準備済み文はディクショナリの情報や、それ自身から参照する他の文に依存します。(ディクショナリの情報とは、表・列・制約・索引・ビュー・トリガのことです。) 準備済み文が依存しているディクショナリの情報や文が、破棄されたり変更されたりすると、内部的に準備済み文は無効となり、Derbyは準備済み文が実行されるとき、自動的に再コンパイルを行おうとします。 もしこのとき、準備済み文の再コンパイルが失敗すると、実行は失敗します。 しかしながら、もし何らかの対応を行って(無くなった表を復活させるなどして)失われた依存性を元に戻せるのなら、失敗した準備済み文を成功裏に実行することができます。これは、Derbyが再実行が要求されたとき、再コンパイルを自動的に行うからです。

お互いに依存した文-UPDATE WHERE CURRENT文は参照する文に依存します。依存する文を破棄すると、UPDATE WHERE CURRENT文は無効になります。

さらに準備済み文の結果がオープンしている場合、ある種のDDL文の実行を妨げます。

それぞれの文に対応したマニュアルの頁には、その文が準備された場合、どのようなことをすると無効になるのかが書かれています。

ここにDerbyのijというツールを使って例を示します。
ij> CREATE TABLE mytable (mycol INT);
0 rows inserted/updated/deleted
ij> INSERT INTO mytable VALUES (1), (2), (3);
3 rows inserted/updated/deleted
-- この例ではijのprepareコマンドを使います。
-- このコマンドにより文が準備されます。
ij> prepare p1 AS 'INSERT INTO MyTable VALUES (4)';
-- p1はmytableに依存します;
ij> execute p1;
1 row inserted/updated/deleted
-- Derbyは再コンパイルせずに文を実行します。
ij> CREATE INDEX i1 ON mytable(mycol);
0 rows inserted/updated/deleted
-- 新しい索引のため、p1は一時的に無効となります。
ij> execute p1;
1 row inserted/updated/deleted
-- Derbyは自動的にp1を再コンパイルして、実行します。
ij> DROP TABLE mytable;
0 rows inserted/updated/deleted
-- Derbyでは以下のように表を破棄することができます。
-- これはp1の結果が閉じているからです。
-- しかしながらp1は一時的に無効となります。
ij> CREATE TABLE mytable (mycol INT);
0 rows inserted/updated/deleted
ij> INSERT INTO mytable VALUES (1), (2), (3);
3 rows inserted/updated/deleted
ij> execute p1;
1 row inserted/updated/deleted
-- p1は無効となっているので、Derbyは実行の前に再コンパイルを行います。
-- 再コンパイルは成功して、文は実行できます。
ij> DROP TABLE mytable;
0 rows inserted/updated/deleted
-- p1は無効です。
-- 今度は最コンパイルしようとしても失敗するので、
-- 実行も失敗です。
ij> execute p1;
ERROR 42X05: Table/View 'MYTABLE' does not exist.