SQL 触发器制造麻烦

标签 sql oracle triggers database

我有电影行政 table

movieexec
与列

(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');

请帮忙。

最佳答案

创建表为

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;
/

关于SQL 触发器制造麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13340451/

相关文章:

database - Postgres PL/Python 初始化记录函数

SQL查询以选择 parent 和 child 的名字

sql - TSQL:使用With语句更新值?

MySQL 查询某个用户到用户列表

oracle - Oracle 列别名中的双引号

sql - 将列数据映射到值 (Oracle)

sql-server - 创建一个不允许更新主键列的触发器

mysql - 在数据可能存在或可能不存在时连接表

php - 快照启动后 : Informix Client -23101/Oracle instant client -28759

tsql - SQL Server View 上的触发器或更改通知