我写了以下代码:
CREATE OR REPLACE TRIGGER CHECK_tuple
BEFORE INSERT ON tableB
FOR EACH ROW
DECLARE IS_JOIN BOOLEAN:=FALSE
BEGIN
SELECT tableB.column1, tableB.column2,
CASE
WHEN IS_JOIN:= FALSE THEN raise_application_error(-20101, 'ERROR.');
ELSE IS_JOIN:= TRUE
END AS CHCK_JOIN
FROM tableB
JOIN tableA
ON tableB.column1=tableA.column1 AND tableB.column2=tableA.column2;
END;
我必须检查表A中是否有一个元组(t1)退出(带有“元组”,我的意思是表中包含多列的整行)。如果存在,则必须与表B中的t2匹配。在表B中插入元组t2之前,必须激活触发器。如果t1与t2不匹配,则标志IS_JOIN将保持为FALSE,Oracle SQL将给出错误。否则,如果t1等于t2,则IS_JOIN将为TRUE,不执行任何操作。我希望对将在表B中插入的每一行进行“检查”。这是正确的方法吗?如果任务不明确,请询问进一步的信息。
答案 0 :(得分:0)
做这样的事情的正确方法:
CREATE OR REPLACE TRIGGER test_test_CHECK_tuple
BEFORE INSERT ON tableB
FOR EACH ROW
declare
v_cnt number(10);
BEGIN
SELECT count(*)
into v_cnt
FROM tableA
where column1=:new.column1
and column2=:new.column2;
if v_cnt= 0 then
raise_application_error(-20101, 'ERROR.');
end if;
END;
:new
表示您要插入的值。没有其他方法可以使用这些值。
顺便说一句。由于foreign key
已分配给foreign key
或primary key
unique key
的工作原理并非如此