0

テーブル、トリガー、シーケンス、そして最後にパッケージをインストールするために使用するSQLスクリプトファイルがあります。パッケージは、SQLスクリプトファイルによって作成されたテーブルを使用します。パッケージは、アプリケーションでイベントが発生したときに実行されるように指定されています。つまり、アプリケーショントリガーが起動されたときにパッケージが実行されます。

パッケージが行うのは、ステージングテーブルへの一括選択挿入を行うことだけです。それがすべてです。

ここで問題となるのは、最初にクリーンインストールを実行すると、パッケージがトリガーされて実行されますが、ステージングテーブルにデータが挿入されないことです。ただし、次のイベントが発生すると、パッケージがトリガーされ、データがステージング安定版に挿入され、正常に機能し続けます。そのため、最初は初期化エラーの可能性があると思いました。

ただし、パッケージを含むSQLスクリプトファイルによって作成されたすべてのオブジェクトを削除してSQLスクリプトファイルを再実行すると、最初のイベントが発生したときにパッケージが正常に機能し、正常に機能し続けます。

したがって、これは初期化エラーにはなり得ません。

しかし、(頭がおかしくなったという理由だけで)もう一度、すべてを削除してスクリプトファイルを再実行すると、最初に気付いたのと同じ動作が見つかります。次に、すべてをもう一度ドロップして、スクリプトファイルを再実行します。最初は問題なく動作します。

なぜそれが代わりに機能するのか私にはわかりません、そしてこれはとても奇妙です。

4

1 に答える 1

3

コードが無効な(コンパイルされていない)状態にあると思います。まだ作成されていないパッケージを呼び出すトリガーがテーブルに作成されます。次に、パッケージが作成されます。最初の実行後、トリガーコードはサーバーによって自動的に再コンパイルされます。作成スクリプトで、すべてのオブジェクトが作成されたら、スクリプトを実行して無効なオブジェクトをコンパイルします(ALTER <object> COMPILE)。

以下をチェックして、これが当てはまることを確認してください。

SELECT object_type, object_name
  FROM all_objects
  WHERE status = 'INVALID'

作成後、ただしイベントがトリガーされる前。

于 2012-09-09T01:58:17.777 に答える