0

我尝试创建一个触发器以防止在 SQL Developer (Oracle 11g XPRESS) 中插入重复条目,但它没有正确编译。你能帮我解释为什么,因为我看不到任何明显的语法错误。

CREATE OR REPLACE TRIGGER trig1

BEFORE INSERT ON table1

BEGIN 
  DECLARE CURSOR C1
  IS
    SELECT value1,value2 FROM inserted;

  DECLARE value11 number;
  DECLARE value22 number;
  OPEN C1;
  FETCH NEXT FROM C1 INTO @value11, @value22;

  WHILE FETCH_STATUS = 0
  LOOP
    IF NOT EXISTS (SELECT * FROM table1 WHERE value1 = @value11 AND value2 = @value22)
    THEN
        INSERT INTO table1 (value1,value2)
        VALUES
        (@value11, @value22);
    ELSE
        ROLLBACK TRANSACTION
        --DELETE FROM table1 WHERE value1 = @value11 AND value2 = @value22
        PRINT 'Cannot add duplicate entry.'
    END IF;
    FETCH NEXT FROM C1 INTO @value11, @value22;
  END LOOP; 
  CLOSE C1;
END;
4

1 回答 1

1

触发器的大多数问题都归咎于您使用了错误的语法。这看起来像 MySQL 而不是 PL/SQL。我建议在继续之前阅读文档并查看一些示例

说了这么多;你正在以错误的方式处理这一切。为了防止插入重复项,您必须在表上创建唯一约束。这是保证您阻止它们的唯一方法;试图在代码中解决它肯定会在某些时候失败。

您可以创建一个唯一约束内联​​,或者如果您的表已经存在,您可以创建一个唯一索引:

CREATE UNIQUE INDEX index_name
    ON table_name (column1, column2, ... column_n);

或使用 ALTER TABLE 语句:

ALTER TABLE table_name
  add CONSTRAINT constraint_name UNIQUE (column1, column2, ... column_n);

如果您要测试的列集是主键,则可以添加主键约束

除了强制完整性,无论您的用户决定什么,启用唯一约束使您能够简单地插入数据并捕获错误。在插入之前无需查询表,这应该会加快您的应用程序。

于 2013-02-05T20:37:37.000 回答