我有两个表,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 /
它给出警告:由于编译错误而创建的触发器。你能帮我找出问题所在吗?
答案 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