【问题标题】:Warning: Procedure created with compilation errors?警告:创建的过程有编译错误?
【发布时间】:2012-01-20 13:14:45
【问题描述】:

为什么这会给我错误?

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

【问题讨论】:

  • 请运行show errors查看编译错误信息是什么(或者从user_errors等中选择出来)

标签: oracle plsql triggers


【解决方案1】:

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 语句触发器将初始化集合,行级触发器将使用新插入行中的键填充集合。然后语句后触发器将遍历集合、查询表并应用您想要的任何业务逻辑。然而,这是一种非常复杂的方法,在实践中很少需要。通过使用约束而不是触发器或在执行插入的存储过程中强制执行业务规则,您通常会得到更好的服务。

【讨论】:

    【解决方案2】:

    您在正文中的第一次选择后缺少一个分号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 2014-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      相关资源
      最近更新 更多