[英]Oracle- Trigger Compiliation error
我正在尝试创建一个触发器来检查插入数据库之前的月份。 尝试了以下代码,但将编译错误显示为Warning: Trigger created with compilation errors.
这是代码
CREATE OR REPLACE TRIGGER tr_july
BEFORE INSERT
ON TBL_EVENT
BEGIN
SELECT EXTRACT(month FROM EVN_DATE) FROM TBL_EVENT;
IF EXTRACT (month from EVN_DATE) == 7 THEN
RAISE_APPLICATION_ERROR(-20110, 'NOT ALLOWED TO INSERT RECORDS DURING JULY');
END IF;
END;
/
我想你正在寻找这样的东西:
CREATE OR REPLACE TRIGGER tr_july
BEFORE INSERT ON TBL_EVENT
BEGIN
IF EXTRACT (month from :new.EVN_DATE) = 7 THEN
RAISE_APPLICATION_ERROR(-20110, 'NOT ALLOWED TO INSERT RECORDS DURING JULY');
END IF;
END; /
研究文档,“访问行触发器中的列值”一节
https://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_triggers.htm
了解如何访问触发器主体中当前行的列。
简而言之:您需要使用名为 NEW 和 OLD 的“相关名称”
提示:运行SET DEFINE OFF;
在编译触发器以避免绑定变量替换之前(变量以冒号:
开头)。
将其用作:
CREATE OR REPLACE TRIGGER tr_july
BEFORE INSERT
ON TBL_EVENT
Declare
E_date date;
BEGIN
SELECT EVN_DATE into E_date FROM TBL_EVENT;
IF EXTRACT (month from E_date) = 7 THEN
RAISE_APPLICATION_ERROR(-20110, 'NOT ALLOWED TO INSERT RECORDS DURING JULY');
END IF;
END;
注:如果甲骨文要求条款=
只有一次
此代码有多个问题。
首先它是插入前触发器,因此您要检查的值尚未在表中。 您无法通过选择找到它。
触发器是 pl/sql 代码。 您在 pl/sql 过程中选择的任何值都必须'select aaa INTO bbb from xxx; 并且 bbb 必须在您的 BEGIN 之前声明。
在 Oracle 中,相等比较运算符是单个 =(不是 ==)。
在触发器中,您有特殊的限定符 :new 和 :old 来引用您正在处理的列值。
在更新触发器中,只有 :new 限定符可用。
CREATE OR REPLACE TRIGGER tr_july
BEFORE INSERT
ON TBL_EVENT
BEGIN
IF EXTRACT (month from :new.EVN_DATE) = 7 THEN
RAISE_APPLICATION_ERROR(-20110, 'NOT ALLOWED TO INSERT RECORDS DURING JULY');
END IF;
END;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.