Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database Oracle触发器无效_Database_Oracle_Triggers_Plsql - Fatal编程技术网

Database Oracle触发器无效

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

我是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.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;