1

ON INSERTOracle データベースでこのファンキーなトリガーを作成する必要があります。

ソースコードの一部が欠落しているこの古いプロジェクトを受け取ったので、データベースのみを使用していくつかの魔法を働かなければなりません。トリガーは、別のビューからの欠損値で挿入時に行を更新する必要があります。

以下は、作成されたサンプル データの一部です。

私はこのテーブルを持っています。それをTABLE1と呼びましょう。次に、このビューがあります。それをVIEW2と呼びましょう。ビューでは、同じコードを持つ複数のレコードが存在する可能性がありますが、それらは完全に重複しているため、どの行も有効です。この重複はごくわずかですが、顧客はまだ除外していません。

  • TABLE1VIEW1には次のフィールドがあります(CODE, PARTNER, COUNTRY)
  • TABLE1にもフィールドがありますCOMMENT

すべてのフィールドは varchar 型です。

このフィールドCOMMENTにはタイプがあり、値に「-XXX-CODE」のvarcharような接尾辞が追加されています。 たとえば、「some comment-XXX-123」です。

これが私のシナリオです:

これはTABLE1に挿入されます:

**CODE;PARTNER;COUNTRY;COMMENT** 

 - 123;TEST;USA;SOME COMMENT
 - 145;TEST2;GB;SOME COMMENT
 - NULL;NULL;NULL;SOME COMMENT-XXX-154

ここでトリガーが開始されます。 - IF フィールドCODE IS NULL の場合、トリガーが起動し、 - XXX- プレフィックスに基づいてコードを解析します (この例では値 154 を使用) - VIEWで選択を行います(select code = 154 の VIEW1 からのコード、パートナー、国 - レコードが見つかった場合は、TABLE1code, partner and country値で更新する必要があります

まあ、状況がはっきりしていることを願っています。私はオラクルの経験がないので、私の問題に対する解決策は大歓迎です。

感謝。

4

1 に答える 1

2

CODE列のタイプがわからないので、INTEGERだと思いました。はい、どうぞ

CREATE OR REPLACE TRIGGER tri_check_nulls
  BEFORE INSERT ON TABLE1
  FOR EACH ROW WHEN (new.CODE is NULL)
DECLARE
    VIEW_CODE   INTEGER;
BEGIN

    VIEW_CODE := TO_NUMBER(SUBSTR(new.COMMENT, INSTR(new.COMMENT, '-', -1, 1) + 1));

    select distinct v.CODE, v.PARTNER, v.COUNTRY
        into  :new.CODE, :new.PARTNER, :new.COUNTRY
        from VIEW1 v
        where v.CODE = VIEW_CODE;

END;
/

もちろん、いくつかのエラーハンドラーを追加する必要があります。また、OracleドキュメントのCREATETRIGGERをお読みください

于 2013-03-20T09:04:38.627 に答える