我是oracle的新手,在这里我试图在插入之前编写一个触发器。
在插入一个表之前,我从查询中获取值,并根据这些表在其他表中搜索。如果我在其他表中找不到相关数据,则插入失败。
但我想只拒绝无效插入并保持有效插入。我试过提出错误,这会导致整个交易失败。那我该怎么办?
CREATE OR REPLACE TRIGGER "SOME_TRIGGER"
BEFORE
INSERT ON "SOME_TABLE"
FOR EACH ROW
DECLARE
var_name VAR_TYPE;
BEGIN
SELECT COUNT(*) INTO var_name FROM OTHER_TABLE
WHERE OTHER_TABLE.SOME_COLUMN = :NEW.SOME_COLUMN;
IF (var_name < 1)
THEN
RAISE_APPLICATION_ERROR(-20001, 'ERR MESSAGE');
ELSE
NULL;
END IF;
END;
答案 0 :(得分:0)
您可能希望查看INSERT语句的LOG ERRORS子句。
e.g。
EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('some_table', 'some_table_errors');
INSERT INTO some_table
SELECT some_column
FROM other_table
LOG ERRORS INTO some_table_errors('my_errors') REJECT LIMIT UNLIMITED;
看起来你也试图以编程方式实现外键约束。通过声明实现这一点要好得多。您可能希望查看CREATE TABLE语句的PRIMARY KEY和FOREIGN KEY子句。