【问题标题】:Error: maximum number of recursive SQL levels (50) exceeded错误:超出最大递归 SQL 级别数 (50)
【发布时间】:2013-12-30 21:36:45
【问题描述】:

我想强制执行诚信,这样一个人一天不能多次借书。表和触发器编译没有错误,但是当您尝试插入时出现上述错误。我无法修复它。语法:

create or replace trigger chk_DateL
for insert or update on lending
COMPOUND TRIGGER
--declare
L_Date number(1);
avail varchar2(10);
subtype copy_booksRec is lending%ROWTYPE;
type copied_bks is table of copy_booksRec;
cbks copied_bks := copied_bks();

after each row is 
begin
  cbks.extend;
  cbks(cbks.last).cb_num := :new.cb_num;
  cbks(cbks.last).sb_num := :new.sb_num;
end after each row;

after statement is
begin
  for i in cbks.first .. cbks.last loop
    select loancode into avail from copy_books where num = cbks(i).cb_num;
    select count(date_L) into L_Date from lending where sb_num = cbks(i).sb_num and date_L = cbks(i).date_L;
      if (L_Date = 0) then
        insert into Lending values (cbks(i).cb_num, cbks(i).sb_num, cbks(i).date_L);
        update copy_books set loancode = 'Not' where num = cbks(i).cb_num;
--        cbks(i).date_L := cbks(i).date_L;
    else
      dbms_output.put_line('You can only make ONE LOAN in a day! You have already loaned a book on ' || L_Date);
      cbks.delete;
    end if;
  end loop;
  end after statement;
end chk_DateL;
/
show errors

【问题讨论】:

  • 你为什么不在Lending(cb_num, sb_num, date_L)上添加一个唯一索引?

标签: sql oracle


【解决方案1】:

你的循环

FORALL i IN cbks.first .. cbks.last
    insert into lending values cbks(i);

插入到借出表中,这会导致再次执行触发器。因此触发器会自行叠加,直到达到 50 级,然后 oracle 通过抛出错误来停止此操作。

【讨论】:

  • 我从这个位置删除了插入 stmt 并将其替换为上面 if stmt 中的 date_L 分配,但它仍然在插入时引发相同的错误代码。新语法现在在上面。 Ps,除了放置唯一索引之外,我还需要一个解决方案。 Tnx
  • 这不会改变任何事情;您仍然可以在借出表上的触发器中调用 insert into lending
  • 我不明白这里的原因。我以这种方式创建了其他几个触发器,但它们都可以正常工作。就像这样,它们是在 table1 上创建的触发器,它们也插入到同一个 table1 中。他们使用 FORALL…stmt 并且在 11g 中仍然可以正常工作。 Lz,我需要在这里改变什么?
  • 哦,我现在明白问题所在了。 Tnx 为你的建议。 ^^
猜你喜欢
  • 1970-01-01
  • 2018-08-16
  • 2012-02-21
  • 1970-01-01
  • 2016-12-10
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
相关资源
最近更新 更多