2012-02-27 19 views
3

私はこれを検索する方法を知らないので、短い質問です。同じ行を「再更新」することはできますか?たとえば、支払いの小計を格納するフィールドがあり、ビジネス上の制約があればその値を更新できます。トリガーだけで同じ行の合計を更新できますか?あらかじめありがとうございます!トリガー中にoracleの同じ行を更新していますか?

ところで、私はOracleとPL/SQLを使用しています。

ビジネスルール:以下があります。店舗はデータを支払うテーブルと、支払う月額料金を格納するテーブルと、可能な割引を格納するテーブルがあります。 1つは支払うことができます一度割引することができます、そして、小計と合計を支払うことになります。それで、私がやっていることは、「割引情報が更新されているときに、コミット後、合計値と料金の値を更新する」というものです。

答えて

4

トリガーが発生している表を更新することはできません。ORA-04091:表の変更でエラーが発生します。 'before'トリガーである限り、:NEW構文を使用して、行自体の値を更新できます。

私は小計についてあなたが何を意味しているのかはっきりしていません。それはあなたがテーブル上に連続した合計フィールドを持っているように聞こえる。同じテーブルの他のレコードに基づいている場合(たとえば、同じオーダーの複数のレコードがあり、挿入されたレコードに前のすべてのレコードの合計が必要な場合)その場合、あなたは同じORA-04901を打つように、あなたはそれを行うことはできません。

あなたはは、たとえば:NEW.subtotal := :OLD.subtotal - :OLD.value + :NEW.valueのために設定することで、あなたはフィールドを調整することができ行を更新している場合は、しかし、そのフィールドの利点がどうなるかわかりません。

ビジネスロジックがどのようなものであるか、挿入/更新によってどのように適合するか、トリガーに何をしたいかを確認すると役に立ちます。このようなものでは、トリガーではなく、挿入/更新の周りにラッパー・プロシージャーを使用したいと思っていますが、現時点では少し曖昧です。

小計の正確さを保つために、私はそれをすべて維持しようとするのではなく、代わりに計算機能を持つビューを使用してください。私の経験ではずっと面倒ではありません。

+0

元の投稿を更新しました。 –

+0

@ user1231958 - 私はそれを行うストアドプロシージャを見ています。おそらく、コミットの前にアップデートを行うことで、アップデートが同時に起こる危険を避けることができます。 –

+0

なんらかの理由で誰かがSQL * Plusコンソールなどに似たようなことがあった場合、間違った方法でデータを挿入/更新すると、すべてがうんざりしてしまいます。 –

1

はい - BEFORE INSERT for each rowトリガーで挿入される値を変更できます。

+0

私は '後でINSERT FOR EACH ROW'を使って作業していますか? –

+0

これは、INSERTの完了後です。挿入した行は変更できません。 –

+0

私はビジネスルールで投稿を更新しました。 –

関連する問題