Oracle Forms 6i アプリケーションがあり、plsql バッチがあり、両方が同じテーブルに対して更新を行っています。Forms アプリケーションのフォームには、表の列に直接マップされるフィールドがあります。テーブルにアクセスするフォームが開いているときは常に、plsql バッチがブロックされます。他のデータベース セッションをブロックしないようにフォームを作成する方法。テーブルのロックを保持しないように、フォームのインスタンスをロード/作成する方法はありますか?
2 に答える
次の 2 つの可能性のいずれかを試すことができます。
1) ブロックにはプロパティ「ロック モード」があり、その値の 1 つは「遅延」です。ヘルプからのテキスト:
Form Builder は、エンド ユーザーがレコードを編集している間ではなく、トランザクションをデータベースに送信している間のみ行をロックします。ユーザーがコミット アクションを実行したときにブロック内のフィールドの値が変更された場合、Form Builder はコミット アクションの処理を防ぎます。
したがって、この値が設定されている場合、DB レコードは更新時にのみロックされます。
2) このブロックの ON-LOCK トリガーを作成し、「実行階層」プロパティ - 「オーバーライド」(これはデフォルトの 1 つです)。そしてトリガープットコードで:
NULL;
この場合、フォームはレコードをロックせず、DB によって必要な場合にのみ行われます (UPDATE ステートメントが発行された後、COMMIT または ROLLBACK が処理されるまで)。
Forms は、データベースにバインドされたアイテムがユーザーまたはトリガーによって変更された場合にのみ、レコードをロックします。
おそらく、データベースにバインドされたアイテムの値を変更する WHEN-NEW-RECORD-INSTANCE または POST-CHANGE トリガーがいくつかあるでしょう。ロック モードをいじる前に、フォームが行ロックを要求する原因を調べておく必要があります。きっと驚かれることでしょう!
最初にブロックとアイテム レベルで ALL WHEN & POST トリガーを無効にして、フォームがまだバッチをロックしているかどうかを調べます。その後、問題の原因となっているトリガーが見つかるまで、トリガーを有効にすることから始めます。