为什么这会给我错误?
CREATE OR REPLACE trigger customerLineCount
BEFORE insert on cust_line
for each row
when(new.cust_id > 0)
DECLARE
lineCount number;
BEGIN
select count (*) into lineCount
from (cust_line inner join customer
on cust_line.cust_id = customer.cust_id)
where (customer.cust_id = :new.cust_id)
if :new.gender = "m" and lineCount = 3 THEN
dbms_output.put_line ('Error! User already has 3 lines');
elseif :new.gender = "f" and lineCount = 1 THEN
dbms_output.put_line ('Error! User already has 1 line');
end if;
END customerLineCount;
/
答案 0 :(得分:5)
1)PL / SQL中的字符串由单引号分隔,而不是双引号。因此,如果你想查看gender
是什么,你需要像
if :new.gender = 'm' and lineCount = 3 THEN
dbms_output.put_line ('Error! User already has 3 lines');
elseif :new.gender = 'f' and lineCount = 1 THEN
dbms_output.put_line ('Error! User already has 1 line');
end if;
2)你的SELECT
语句在结尾处缺少分号。
3)但是,一旦解决了编译错误,您几乎肯定会遇到运行时错误。通常,表上的行级触发器无法查询同一个表。因此,cust_line
上的行级触发器无法查询cust_line
表。您可以通过创建包含PL / SQL集合然后创建多个触发器的包来解决这个问题。 before语句触发器将初始化集合,行级触发器将使用新插入的行中的键填充集合。然后一个after语句触发器将遍历集合,查询表,并应用您想要的任何业务逻辑。然而,这是一种非常复杂的方法,在实践中很少需要。通过使用约束而不是触发器或通过在执行插入的存储过程中强制执行业务规则,通常可以更好地服务。
答案 1 :(得分:3)
在正文中第一次选择后,您缺少分号。