0

個人のID番号と申請したジョブのJobIDを指定するデータを保持するTBLAPPLICATIONというテーブルがあります。各ID番号には無制限の数のアプリケーションを含めることができます。ただし、JobIDは毎回異なるため、重複するアプリケーションはありません。

create or replace
   TRIGGER trg_duplicateapplication BEFORE INSERT ON tblapplication FOR EACH ROW

BEGIN
   IF :NEW.studentrecordnumber_fk_nn = :OLD.studentrecordnumber_fk_nn THEN
      IF :NEW.jobid_fk_nn = :OLD.jobid_fk_nn
         THEN RAISE_APPLICATION_ERROR( -20003, 'Error: duplicate application. You have already applied for this position.');
      END IF;
   END IF;
END;

したがって、上記のコードは機能しません。誰かが私の間違いを強調していただけますか?:)

4

3 に答える 3

8

現状では、トリガーは挿入された値(:NEW.studentrecordnumber_fk_nnなど)を存在しないものと比較しています:OLD(トリガーには:OLD意味がありません— INSERT<a href="http://docs.oracle.com/cd/E11882_01/appdev.112/ e25519 / triggers.htm#LNPLS99955 "rel =" noreferrer ">フィールドは常にnull)。

それはさておき、これはトリガーではなくDRIによってほぼ確実に達成されるはずです。上の一意のインデックスは(studentrecordnumber_fk_nn, jobid_fk_nn)どうでしょうか。

于 2012-12-03T18:12:51.840 に答える
0

MERGEステートメントを使用して、テーブルに挿入する前に各カップル(id、application)を確認できます(テーブルに既に存在するかどうかを確認します)。

http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_9016.htm#SQLRF01606

よろしく、

Dariyoosh

于 2012-12-03T18:56:07.857 に答える
0

テーブルTBLAPPLICATIONで、どの識別子が一意であり(JobID?)、重複しないようにしたい(studentrecordnumber_fk_nn?)かどうかはわかりません。しかし、studentrecordnumber_fk_nnでの重複を防ぐためのスクリプトを作成しました。そして、私の例「アルファベット」では、重複を防ぐためにまったく同様のスクリプトを作成しました。以前にテーブルに挿入された文字を挿入することはできません。

お役に立てば幸いです。z

CREATE OR REPLACE TRIGGER trg_duplicateapplication
BEFORE INSERT
ON tblapplication
FOR EACH ROW
DECLARE
counter integer;
BEGIN
  SELECT * INTO counter FROM
      (SELECT COUNT(rownum) FROM tblapplication a
        WHERE a.studentrecordnumber_fk_nn = :new.studentrecordnumber_fk_nn);
  IF counter = 1 THEN
  RAISE_APPLICATION_ERROR( -20003,
  'Error: duplicate application. You have already applied for this position.');
  END IF;
END;
/


––The Alphabet


CREATE TABLE alphabet
(letter VARCHAR2(2));
INSERT INTO alphabet VALUES ('A');
INSERT INTO alphabet VALUES ('B');
INSERT INTO alphabet VALUES ('C');
INSERT INTO alphabet VALUES ('D');

CREATE OR REPLACE TRIGGER insertvalue
BEFORE INSERT
ON alphabet
FOR EACH ROW
DECLARE counter INTEGER;
BEGIN
    SELECT * INTO counter FROM
      (SELECT COUNT(rownum) FROM alphabet a WHERE a.letter = :new.letter);
    IF counter = 1 THEN
      RAISE_APPLICATION_ERROR(-20012,'Duplicated value');
    END IF;
END;
/
于 2018-04-16T18:10:30.600 に答える