1

Oracle Forms 6i アプリケーションがあり、plsql バッチがあり、両方が同じテーブルに対して更新を行っています。Forms アプリケーションのフォームには、表の列に直接マップされるフィールドがあります。テーブルにアクセスするフォームが開いているときは常に、plsql バッチがブロックされます。他のデータベース セッションをブロックしないようにフォームを作成する方法。テーブルのロックを保持しないように、フォームのインスタンスをロード/作成する方法はありますか?

4

2 に答える 2

1

次の 2 つの可能性のいずれかを試すことができます。

1) ブロックにはプロパティ「ロック モード」があり、その値の 1 つは「遅延」です。ヘルプからのテキスト:

Form Builder は、エンド ユーザーがレコードを編集している間ではなく、トランザクションをデータベースに送信している間のみ行をロックします。ユーザーがコミット アクションを実行したときにブロック内のフィールドの値が変更された場合、Form Builder はコミット アクションの処理を防ぎます。

したがって、この値が設定されている場合、DB レコードは更新時にのみロックされます。

2) このブロックの ON-LOCK トリガーを作成し、「実行階層」プロパティ - 「オーバーライド」(これはデフォルトの 1 つです)。そしてトリガープットコードで:

NULL;

この場合、フォームはレコードをロックせず、DB によって必要な場合にのみ行われます (UPDATE ステートメントが発行された後、COMMIT または ROLLBACK が処理されるまで)。

于 2013-07-31T06:15:46.173 に答える
0

Forms は、データベースにバインドされたアイテムがユーザーまたはトリガーによって変更された場合にのみ、レコードをロックします。

おそらく、データベースにバインドされたアイテムの値を変更する WHEN-NEW-RECORD-INSTANCE または POST-CHANGE トリガーがいくつかあるでしょう。ロック モードをいじる前に、フォームが行ロックを要求する原因を調べておく必要があります。きっと驚かれることでしょう!

最初にブロックとアイテム レベルで ALL WHEN & POST トリガーを無効にして、フォームがまだバッチをロックしているかどうかを調べます。その後、問題の原因となっているトリガーが見つかるまで、トリガーを有効にすることから始めます。

于 2013-09-24T18:40:43.640 に答える