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