【问题标题】:ORA-04079:invalid trigger specificationORA-04079: 无效的触发器规范
【发布时间】:2016-08-02 17:58:38
【问题描述】:
create or replace trigger fineCalc
AFTER UPDATE ON book_issue
for each row
when ((new.date_of_return-old.date_of_issue)>7) 
declare 
  rcpt_no  number;
  s_id  char(10);
begin
  if :old.card_id in (select card_id from STUDENT_BOOK_ISSUE)
  then
    select max(receipt_no) into rcpt_no from fine;
    select student_id into s_id from STUDENT_BOOK_ISSUE sbi where sbi.card_id=:old.card_id;

    insert into fine values( rcpt_no+1,((:NEW.date_of_return-:OLD.date_of_issue-7)*5),s_id);
  end if;
end;

这会得到 ORA-04079:Apex 的 SQL Workshop 中的无效触发器规范:

我该如何解决?

【问题讨论】:

  • 得到 PLS-00405: subquery not allowed in this context,不是 ORA-04079。您不能将子查询作为ifyou need to get the query result into a variable 的一部分。请参阅How do I ask a good question?。显示你正在运行的实际代码和你得到的错误将是一个好的开始。
  • 我在 oracle 11g 中执行触发操作....然后它显示 ORA:04079 错误,而在 oracle SQL Developer 上它显示 PLS-00405:Subquery not allowed in this context.... .我现在该怎么办
  • 与错误无关,但使用max(receipt_no) 不是一个好主意;这是better to use a sequence
  • 您在哪里看到 ORA-04079?您确定这不只是在早期编译尝试的屏幕上吗?您似乎建议“在 oracle 11g 中”意味着与 SQL Developer 不同的客户端,但那是数据库版本。如果您在两个客户端中遇到不同的行为,请告诉我们它们都是什么,包括您正在使用的版本。
  • 我确信我仍然遇到同样的错误.....如果有办法发送屏幕截图我一定会发送它......

标签: oracle triggers oracle-apex


【解决方案1】:

按照 Alex 的建议,将 if 条件移到外面,然后重试。

create or replace trigger fineCalc
AFTER UPDATE ON book_issue
for each row
when ((new.date_of_return-old.date_of_issue)>7) 
declare 
  rcpt_no  number;
  s_id  char(10);
  v_count number;
begin
  select count(*) into v_count from STUDENT_BOOK_ISSUE where card_id=:old.card_id;
  if v_count > 0
  then
    select max(receipt_no) into rcpt_no from fine;
    select student_id into s_id from STUDENT_BOOK_ISSUE sbi where sbi.card_id=:old.card_id;
    insert into fine values( rcpt_no+1,((:NEW.date_of_return-:OLD.date_of_issue-7)*5),s_id);
  end if;
end;

【讨论】:

  • 抱歉begin 子句没有放在正确的位置。感谢@alex 纠正它。 @abhishekjadhavpatil - 尝试更新的答案并再次检查。
  • 第二行的 book 和 issue 之间没有下划线。在fine 之后的第13 行之后没有;。看起来您没有复制答案中给出的代码。修复它。
  • 我已根据建议进行了更改,但仍然出现相同的错误。
  • 感谢 Alex 和 Utsav....我的触发器已创建并成功更新数据库
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
相关资源
最近更新 更多