0

我有一个名为 TBLAPPLICATION 的表,其中包含指定个人 ID 号和他们申请的工作的 JobID 的数据。每个 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

问候,

达里约什

于 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 回答