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

Lis*_*isa 0 oracle triggers plsql

为什么这会给我错误?

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;
/
Run Code Online (Sandbox Code Playgroud)

Jus*_*ave 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;
Run Code Online (Sandbox Code Playgroud)

2)你的SELECT陈述最后遗漏了一个分号.

3)但是,一旦解决了编译错误,您几乎肯定会遇到运行时错误.通常,表上的行级触发器无法查询同一个表.因此,您的行级触发器cust_line无法查询该cust_line表.您可以通过创建包含PL/SQL集合然后创建多个触发器的包来解决这个问题.before语句触发器将初始化集合,行级触发器将使用新插入的行中的键填充集合.然后一个after语句触发器将遍历集合,查询表,并应用您想要的任何业务逻辑.然而,这是一种非常复杂的方法,在实践中很少需要.通过使用约束而不是触发器或通过在执行插入的存储过程中强制执行业务规则,通常可以更好地服务.