0

このトリガーは、10% を超える価格上昇が発生した場合にエラーをスローすることになっています。何らかの理由で PLS-00103 エラーが表示されます。

CREATE OR REPLACE TRIGGER product_price_updt
BEFORE UPDATE ON PRODUCT
FOR EACH ROW
DECLARE
price_error VARCHAR2(100);
BEGIN
IF (:new.price > :old.price * 1.1) THEN raise price_error;
END IF;
EXCEPTION 
when price_error then ('Price increase is greater than 10%, update cancelled');
END;

コンパイルするとこんな感じ。

Error(7,78): PLS-00103: Encountered the symbol ")" when expecting one of the following:     * & = - + < / > at in is mod remainder not rem    <an exponent (**)> <> or != or ~= >= <= <> and or like like2    like4 likec as between || multiset member submultiset 

おそらく私の構文が間違っていて、エラーが誤解を招く可能性があります。問題が見つかりません。

4

1 に答える 1

1

RAISE は EXCEPTION と共に使用する必要があります。ここでは、VARCHAR2 引数と共に使用していますが、これが 1 つの問題です。私が見ることができるもう1つの例外ブロックには、何らかの関数呼び出しが必要な文字列(「価格の上昇は10%を超えています。更新はキャンセルされました」)があります。トリガーを次のように書き直すことをお勧めします。

CREATE OR REPLACE TRIGGER product_price_updt
  BEFORE UPDATE ON PRODUCT
  FOR EACH ROW
DECLARE
  price_error EXCEPTION;
BEGIN
  IF (:new.price > :old.price * 1.1) THEN
    raise price_error;
  END IF;
EXCEPTION 
  when price_error then
    DBMS_OUTPUT.PUT_LINE('Price increase is greater than 10%, update cancelled');
END product_price_updt;

共有してお楽しみください。

于 2013-04-01T19:21:12.283 に答える