繁体   English   中英

Oracle-触发器编译错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM