Database Oracle触发器无效
我是SQL新手,我正在尝试创建一个触发器,该触发器将插入到审计表中Database Oracle触发器无效,database,oracle,triggers,plsql,Database,Oracle,Triggers,Plsql,我是SQL新手,我正在尝试创建一个触发器,该触发器将插入到审计表中 create or replace trigger late_ship_insert after insert on suborder for each row declare employee int; begin select emp_id into employee from handles where order_no = :new.order_no; if :new.actu
create or replace trigger late_ship_insert
after insert on suborder
for each row
declare
employee int;
begin
select emp_id
into employee
from handles
where order_no = :new.order_no;
if :new.actual_ship_date > :new.req_ship_date then
insert into ship_audit
values (employee, :new.order_no, :new.suborder_no, :new.req_ship_date, :new.actual_ship_date);
end;
错误:
Warning: execution completed with warning
trigger late_ship_insert Compiled.
但是,一旦我尝试一个insert语句,它就会告诉我触发器不起作用,它会放弃它
Error starting at line 1 in command:
insert into suborder
values ( 8, 3, '10-jun-2012', '12-jul-2012', 'CVS', 3)
Error at Command Line:1 Column:12
Error report:
SQL Error: ORA-04098: trigger 'COMPANY.LATE_SHIP_INSERT' is invalid and failed re-validation
04098. 00000 - "trigger '%s.%s' is invalid and failed re-validation"
*Cause: A trigger was attempted to be retrieved for execution and was
found to be invalid. This also means that compilation/authorization
failed for the trigger.
*Action: Options are to resolve the compilation/authorization errors,
disable the trigger, or drop the trigger.
如果您知道是什么原因导致了这种情况,我们将非常感谢您的帮助。谢谢 格式化代码时出现的明显错误是
IF
语句缺少END IF
create or replace trigger late_ship_insert
after insert on suborder
for each row
declare
employee int;
begin
select emp_id
into employee
from handles
where order_no = :new.order_no;
if :new.actual_ship_date > :new.req_ship_date then
insert into ship_audit
values (employee, :new.order_no, :new.suborder_no, :new.req_ship_date, :new.actual_ship_date);
end if;
end;
一般来说,您应该始终在INSERT
语句中列出目标表的列,而不是依赖于INSERT
语句为每一列指定一个值并以正确的顺序指定它们。这将使您的代码更加健壮,因为例如,当有人向表中添加其他列时,代码不会变得无效。看起来是这样的(我在猜测ship\u audit
表中的列名称)
创建触发器后,请执行
显示错误
,并向我们显示错误消息。如果在Oracle中找到int
类型,我会感到惊讶。。。试试数字?我想你错过了一个END IF代码>另外,我认为所有声明的变量都应该放在开头。创建触发器后:Warning:execution completed with Warning trigger late\u ship\u insert Compiled。我把int改为number,但还是一样。问题是,当我在子订单上尝试insert语句时,它会在子订单上给我第二个错误post@user1354275-假设您使用的是SQL*Plus,当您创建触发器并获得警告时,请键入show errors
。正如@a_horse_with_no_name所述,这将向您显示您在尝试创建触发器时收到的实际错误和警告。我明白了,非常感谢您的解释,它真的很有帮助!
create or replace trigger late_ship_insert
after insert on suborder
for each row
declare
employee int;
begin
select emp_id
into employee
from handles
where order_no = :new.order_no;
if :new.actual_ship_date > :new.req_ship_date then
insert into ship_audit( emp_id, order_no, suborder_no, req_ship_date, actual_ship_date )
values (employee, :new.order_no, :new.suborder_no, :new.req_ship_date, :new.actual_ship_date);
end if;
end;