想象一下这两个表
CREATE TABLE A
(
idA smallint primary key,
idP smallint ,
...
);
CREATE TABLE P
(
idP smallint primary key,
Type char , (ex:A, B, C)
...
);
我想表现得如果在表A中没有与表P中相同的类型,例如不是工人
CREATE OR REPLACE TRIGGER VERIFYTYPE
BEFORE INSERT OR UPDATE ON A
FOR EACH ROW
BEGIN
IF((SELECT tp.Type
FROM P tp
WHERE tp.idP=:new.idP)!='W')
THEN RAISE_APPLICATION_ERROR(-20001, 'That is not a worker');
END IF;
END;
我相信有些不对劲
答案 0 :(得分:1)
在PL / SQL中,您需要选择一个变量。但是gmiley是正确的,带索引的外键或虚拟列是更好的解决方案。
CREATE OR REPLACE TRIGGER VERIFYTYPE
BEFORE INSERT OR UPDATE ON A
FOR EACH ROW
v_type CHAR(3);
BEGIN
SELECT tp.Type
INTO v_type
FROM P tp
WHERE tp.idP=:new.idP;
IF v_type != 'W'
THEN
RAISE_APPLICATION_ERROR(-20001, 'That is not a worker');
END IF;
END;
答案 1 :(得分:0)
你必须:
重命名列'type',因为这是一个关键字,使用它时会遇到很多麻烦
将变量x添加到声明部分
使用SELECT col INTO x construct
在IF构造中使用x