1

小さなトリガーを作成するだけです。このトリガーでやりたいことは、顧客が一度に 10 件の注文しか発注テーブルに入れられないようにすることです。なぜ私のクライアントがこれを望んでいるのかを聞かないでください。私にはばかげているように思えます。

しかし、基本的にトリガーは発注テーブルにあります。現在、customer_ID で DISTINCT COUNT を選択し、それを v_count VARIABLE に配置しています。

IF v_count < 10 INSERT INTO placed_order
ELSE
DBMS_OUTPUT.PUT_LINE ('you have 10 or more orders processing please wait')
END if
END

これはコードの基本的な要点ですが、実行されません。必要に応じて完全なコードを表示できますか?

これがコードです - 申し訳ありませんが、SQLFiddle の使用方法が今のところわかりません。

     CREATE OR REPLACE TRIGGER trg_order_limit
     BEFORE INSERT
     ON placed_order
     FOR EACH ROW
     DECLARE
     v_count number;
     BEGIN
     SELECT COUNT(DISTINCT FK1_customer_id) FROM placed_order into v_count;
     if v_count < 10 then
     INSERT INTO placed_order
     (order_id,  order_date, delivery_date, FK1_customer_id, FK2_employee_id,        FK3_Order_type_id)
     VALUES
     (:NEW.order_id, :NEW.order_date, :NEW.delivery_date, :NEW.FK1_customer_id,     :NEW.FK2employee_id, :NEW.FK3_order_type_id);
     ELSE
     v_count > 10 then
     DBMS_OUTPUT.PUT_LINE('You currently have 10 or more orders processing.');
     end if;
     end;

Oracle でスクリプトを実行すると、4 行目でエラーが発生します: PL/SQL: ORA-00933: SQL コマンドが正しく終了しませんでした

どうもありがとうリチャード

4

1 に答える 1

3

トリガーに構文エラーがなかったとしても、それは機能しません。「10 件を超える注文はできません」というメッセージを出力するだけで、挿入は続行されます。さらに、テストに合格すると、挿入のループに陥ります。レコードが多すぎる場合は例外をスローする必要があり、アプリケーションはそれをキャッチし、テストに合格した場合は何もしません。

エラーに関しては、問題は次の行にあると思います。

SELECT COUNT(DISTINCT FK1_customer_id) FROM placed_order into v_count;

そのはず:

SELECT COUNT(DISTINCT FK1_customer_id) into v_count FROM placed_order;

ただし、このクエリはとにかく間違っています。注文を行った一意の顧客の数が返されます。あなたが探しているものは次のとおりです。

select count(order_id) into v_count from placed_order where fk1_customer_id = :new.fk1_customer_id

order_id一意性制約があると仮定します。これは可能性が高いようです!とにかく、したがって、トリガーコードは次のようになります。

create or replace trigger trg_order_limit
before insert on placed_order for each row
declare
  v_count number;
begin
  -- Get current order count
  select count(order_id)
  into   v_count
  from   placed_order
  where  fk1_customer_id = :new.fk1_customer_id;

  -- Raise exception if there are too many
  if v_count >= 10 then
    raise_application_error(-20000, 'You currently have 10 or more orders processing.');
  end if;
end;

ただし、@ DazzaL のコメントによると、このアプローチはおそらく良い考えではありません。


編集クライアントごとの注文数をカウントするクエリが完全に間違っていることに突然気づきました。私の答えを更新しました。

于 2013-03-21T11:52:09.433 に答える