Oracle 警告:使用编译错误创建的过程?

Oracle 警告:使用编译错误创建的过程?,oracle,plsql,triggers,Oracle,Plsql,Triggers,为什么这会给我错误 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_lin

为什么这会给我错误

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;
/

正文中第一个select后缺少分号。

1 PL/SQL中的字符串由单引号分隔,而不是双引号分隔。所以如果你想知道性别是什么,你需要

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_行上的行级触发器无法查询cust_行表。您可以通过创建一个包含PL/SQL集合的包,然后创建多个触发器来解决这个问题。before语句触发器将初始化集合,行级触发器将使用新插入行中的键填充集合。然后,after语句触发器将遍历集合,查询表,并应用您想要的任何业务逻辑。然而,这是一种非常复杂的方法,在实践中很少有必要。通过使用约束而不是触发器,或者通过在执行插入的存储过程中强制执行业务规则,通常可以更好地为您提供服务

请运行“显示错误”以查看编译错误消息是什么,或从用户错误中选择它,等等。