SQL触发器造成麻烦

时间:2012-11-12 08:33:44

标签: sql oracle triggers database

我有电影执行表

movieexec
,列

  

(名称varchar2(20),地址varchar2(20),证书编号(10),networth浮动)

  我想创建一个计算平均净值的触发器,如果​​它超过某个数量说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');

友好协助。

2 个答案:

答案 0 :(得分: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;
/

答案 1 :(得分:1)

使用触发器没有安全的方法,因为总会有一种方法来破坏它。

在Oracle EE中,您可以在提交物化视图上创建快速刷新以存储聚合,并对其进行检查约束。

此外,请勿使用SYS或SYSTEM帐户创建自己的对象。