# 依存関係

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.

Parent topic: 文