Oracle-触发器编译错误

时间:2016-03-20 09:57:39

标签: sql oracle triggers

我正在尝试创建一个触发器来检查插入数据库之前的月份。尝试了以下代码,但将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;
/

3 个答案:

答案 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;