警告:触发器创建时出现编译错误

时间:2020-10-06 11:53:07

标签: oracle triggers warnings

我有两个表,seat_allocation和program_code。我想创建一个触发器,以检查seat_allocation中的条目数是否等于该prog_code(program_code表中的列)的max_seats(programm_code表中的列)。这是我的代码:

SQL> create or replace trigger seats_full
  2  before insert on seat_allocation
  3  for each row
  4  declare
  5  cnt programme_code.max_seats%type;
  6  max programme_code.max_seats%type;
  7  begin
  8  select count(*) into cnt from seat_allocation where prog_code=(select prog_code from programme_code where prog_code = :NEW.prog_code);
  9  select max_seats into max from programme_code where prog_code=(select prog_code from programme_code where prog_code = :NEW.prog_code);
 10  if max=cnt then
 11  RAISE_APPLICATION_ERROR(-21000,'No vacant seats available');
 12  end if;
 13  end;
 14  /

它给出警告:由于编译错误而创建的触发器。你能帮我找出问题所在吗?

1 个答案:

答案 0 :(得分:0)

变量名不能为MAX,保留给具有相同名称的函数。将其更改为例如v_max_seats


除此之外,似乎您正在seat_allocation表(第8行)中进行选择,而触发器在同一表上的插入时触发。这将导致变异表错误,因此-您将必须做点事情。如今,可以通过复合触发器来解决此问题。如果您的数据库版本不支持它,则将使用一个软件包。互联网上有一些例子。


此外,为什么要使用子查询?例如,怎么了?

select max_seats into v_max_seats from programme_code where prog_code = :new.prog_code