-1

私は Oracle と SQL を初めて使用し、req_ship_date (suborder テーブル) が 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句には常に 1 行が必要です。

単一の結果が返されるように where 句を追加します。

于 2012-07-19T15:55:35.533 に答える
0
  • @Shine が指摘しているようWHEREに、クエリに対して句が必要です。CUSTOMER_ORDER
  • の行レベル トリガーでSUBORDERは、クエリを実行できませんSUBORDER。これを行うと、一般的に変更テーブル エラーが発生します。SUBORDER_NOただし、これが の主キーであると仮定するとSUBORDER、テーブルに対してクエリを実行する必要はありません。:new.req_ship_date手元にある値を使用するだけです。

customer_orderこのようなものは、の主キーがテーブルに存在するorder_noと仮定して機能するはずです。order_nosuborder

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 に答える