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语句触发器将遍历集合,查询表,并应用您想要的任何业务逻辑。然而,这是一种非常复杂的方法,在实践中很少有必要。通过使用约束而不是触发器,或者通过在执行插入的存储过程中强制执行业务规则,通常可以更好地为您提供服务 请运行“显示错误”以查看编译错误消息是什么,或从用户错误中选择它,等等。