2

我有电影行政桌

电影执行官
与列

(名称 varchar2(20),地址 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 回答