我正在尝试创建一个触发器来检查插入数据库之前的月份。尝试了以下代码,但将complationng错误显示为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;
/
答案 0 :(得分:1)
我认为你正在寻找这样的东西:
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;
以避免绑定变量替换(冒号:
前面的变量)。
答案 1 :(得分:0)
将其用作:
180
注意:Oracle if子句只需要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;
答案 2 :(得分:0)
此代码有多个等级。
首先它是一个插入触发器之前,因此您要检查的值尚未在表中。您无法通过选择找到它。
触发器是pl / sql代码。您在pl / sql过程中选择的任何值都必须从xxx中选择aaa INTO bbb;必须在你的BEGIN之前宣布bbb。
在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;