我有电影执行表
movieexec,列
我想创建一个计算平均净值的触发器,如果它超过某个数量说400000,则不应该进一步插入并且应该显示错误消息。(名称varchar2(20),地址varchar2(20),证书编号(10),networth浮动)
我实现了以下代码:
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');
友好协助。
答案 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帐户创建自己的对象。