Oracle 警告:使用编译错误创建触发器

Oracle 警告:使用编译错误创建触发器,oracle,triggers,warnings,Oracle,Triggers,Warnings,我有两张桌子,座位分配和节目代码。我想创建一个触发器,用于检查座位分配中的条目数是否等于该程序代码(程序代码表中的列)的最大座位数(程序代码表中的列)。这是我的代码: 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 pro

我有两张桌子,座位分配和节目代码。我想创建一个触发器,用于检查座位分配中的条目数是否等于该程序代码(程序代码表中的列)的最大座位数(程序代码表中的列)。这是我的代码:

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  /

它给出警告:触发器是用编译错误创建的。您能帮我找出问题所在吗?

变量名不能是
MAX
,它是为同名函数保留的。将其更改为例如
v_max_seats


除此之外,您似乎正在从
seat_allocation
表(第8行)中进行选择,而触发器在同一个表上的insert上触发。这将导致变异表错误,因此-您必须采取措施。如今,解决这一问题的是一种复合触发器。如果您的数据库版本不支持它,您将使用一个包。互联网上有一些例子


还有,为什么要使用子查询?你怎么了

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

哦,好的,谢谢,我试试看。谢谢你的帮助!一个有用的提示:如果您计划从命令行编译代码,那么在编译对象之后,如果它有错误,您可以使用
显示错误命令以查看导致对象无法编译的错误。