2

私は映画のエグゼクティブテーブルを持っています

ムービーエグゼクティブ
列と

(name varchar2(20), address varchar2(20), cert# number(10), networth float)

平均純資産を計算するトリガーを作成したいのですが、400000 などの金額を超えると、それ以上挿入できなくなり、エラー メッセージが表示されます。

次のコードを実装しました。

CREATE OR REPLACE TRIGGER pronet
AFTER INSERT
ON movieexec
FOR EACH ROW
DECLARE netavg float;
BEGIN
  SELECT AVG(networth) INTO netavg FROM movieexec;
  IF(netavg>400000) THEN
     RAISE_APPLICATION_ERROR(-20000,'average limit reached, cannot insert');
  ENDIF;
END

しかし、以下のエラーが発生します

ERROR at line 7: PLS-00103: Encountered the symbol ";" when expecting one of the following:
  if
5. DECLARE netavg float;
6. BEGIN
7. **SELECT AVG(networth) INTO netavg FROM movieexec;**
8. IF(netavg>400000) THEN
9. RAISE_APPLICATION_ERROR(-20000,'average limit reached, cannot insert');

親切に助けてください。

4

2 に答える 2

2

次のようにテーブルを作成

CREATE TABLE movieexec
(
    name          VARCHAR2 (20),
    address   VARCHAR2 (20),
    cert_no   NUMBER (10),
    networth   FLOAT
);

そしてトリガーを次のように作成します

CREATE OR REPLACE TRIGGER pronet
    AFTER INSERT
    ON movieexec
    FOR EACH ROW
DECLARE
    netavg  FLOAT;
BEGIN
    SELECT  AVG (networth)
      INTO  netavg
      FROM  movieexec;

    IF (netavg > 400000)
    THEN
        raise_application_error (-20000,
                                         'average limit reached, cannot insert'
                                        );
    END IF;
END;
/
于 2012-11-12T08:40:54.910 に答える
1

トリガーを使用してこれを行う安全な方法はありません。常にそれを覆す方法があるからです。

Oracle EE では、コミット マテリアライズド ビューで高速リフレッシュを作成して集計を格納し、それにチェック制約を設定する場合があります。

また、独自のオブジェクトを作成するために SYS または SYSTEM アカウントを使用しないでください。

于 2012-11-12T09:21:44.730 に答える