-1

我是 Oracle 和 SQL 的新手,我正在尝试创建一个触发器,其中 req_ship_date(子订单表)不能在 order_date(customer_order 表)之前。我创建了触发器:

create or replace trigger req_ship_date_error
before insert on suborder
for each row
declare
placed_date date;
req_date date;
begin
select order_date into placed_date
from customer_order;
select req_ship_date into req_date
from suborder
where suborder_no = :new.suborder_no;
if placed_date > req_date then
raise_application_error(-20002, ('Order ' || :new.suborder_no || ' required shipping date cannot be before order date'));
end if;
end;

但即使在尝试插入一个好的语句之后,我也会收到以下错误

insert into suborder
values  ( 8, 2, '10-jul-2012', '12-jul-2012', 'CVS', 2);

错误

    Error starting at line 1 in command:
insert into suborder
    values  ( 8, 2, '10-jul-2012', '12-jul-2012', 'CVS', 2)
Error report:
SQL Error: ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at "COMPANY.REQ_SHIP_DATE_ERROR", line 5
ORA-04088: error during execution of trigger 'COMPANY.REQ_SHIP_DATE_ERROR'
01422. 00000 -  "exact fetch returns more than requested number of rows"
*Cause:    The number specified in exact fetch is less than the rows returned.
*Action:   Rewrite the query or change number of rows requested

知道是什么原因造成的吗?谢谢

4

2 回答 2

1

您在第一个触发器的 SELECT 查询中缺少 where 子句:

 select order_date into placed_date
  from customer_order;

将返回许多行,因此 Oracle 不知道从哪一个中选择日期(将其放在placed_date变量中)。INTO子句总是需要一行。

添加 where 子句以便返回单个结果。

于 2012-07-19T15:55:35.533 回答
0
  • 正如@Shine 指出的那样,您需要WHERE在查询中添加一个子句CUSTOMER_ORDER
  • SUBORDER然后无法查询的行级触发器SUBORDER。如果你这样做,你最终会得到一个变异表错误。但是,假设这SUBORDER_NO是 的主键SUBORDER,您不需要查询该表。只需使用:new.req_ship_date您手中的价值。

假设主键customer_orderisorder_no并且order_no存在于suborder表中,这样的事情应该可以工作。

create or replace trigger req_ship_date_error
  before insert on suborder
  for each row
declare
  l_placed_date date;
begin
  select order_date 
    into l_placed_date
    from customer_order
   where order_no = :new.order_no;
  if l_placed_date > :new.req_ship_date 
  then
    raise_application_error(
      -20002, 
      'Order ' || :new.suborder_no || ' required shipping date cannot be before order date');
  end if;
end;
于 2012-07-19T16:25:53.753 回答