Sql Oracle触发器-检查已存在的数据

Sql Oracle触发器-检查已存在的数据,sql,oracle,triggers,Sql,Oracle,Triggers,我想检查正在输入的时间,看它是否在已存储的任何其他约会的2小时内 我的表是test(id、number和testdate、时间戳) 我有一个触发器,检查新时间是否在我指定的时间的2小时内 create or replace trigger "TEST_T1" BEFORE insert on "TEST" for each row when (new.testdate is not null) begin if (:new.testdate BETWEEN (to_timestamp('

我想检查正在输入的时间,看它是否在已存储的任何其他约会的2小时内

我的表是test(id、number和testdate、时间戳)

我有一个触发器,检查新时间是否在我指定的时间的2小时内

create or replace trigger "TEST_T1"
BEFORE
insert on "TEST"
for each row
when (new.testdate is not null)
begin
    if (:new.testdate BETWEEN (to_timestamp('12-AUG-12 02:00:00PM') - interval '120'   minute) 
                      AND (to_timestamp('12-AUG-12 02:00:00PM')  + interval '120' minute))
    then raise_application_error(-20634, 'This time clashes with another event.');
    end if;
end;
是否可以用数据库中的时间列表替换我输入的这一次

在下面MichałPowaga的帮助下,我成功地使用

create or replace trigger "TEST_T1"
BEFORE
insert on "TEST"
for each row
when (new.testdate is not null)
begin
    DECLARE l_exists INTEGER;
    BEGIN
        SELECT COUNT(*) INTO l_exists FROM test WHERE testdate BETWEEN :new.testdate - interval '120' minute AND :new.testdate + interval '120' minute AND ROWNUM = 1;
        IF l_exists = 1 THEN raise_application_error(-20634, 'This time clashes with another event.');
        END IF;
    END;
END;
创建或替换触发器“TEST_T1”
之前
在“测试”中插入
每行
何时(new.testdate不为空)
开始
申报数量整数:=0;
开始
选择count(*)into qty from test,其中testdate介于(:new.testdate-2/24)和(:new.testdate+2/24)之间,rownum=1;
如果数量>0,则
raise_应用程序_错误(-20634,‘这次与另一个事件冲突’);
如果结束;
结束;
结束;

另外,请注意,我不是Oracle开发人员,因此可能会有错误,但我认为这是正确的做法:-)

感谢您的帮助-这让我走上了正确的道路。您不能在那里使用exists,所以这就是我在(new.testdate不为null)开始声明l_exists INTEGER时,在插入每行的“TEST”之前创建或替换触发器“TEST_T1”所做的
;从测试开始选择l_中的计数(*),其中testdate介于:new.testdate-间隔“120”分钟和:new.testdate+间隔“120”分钟之间,ROWNUM=1;如果l_exists=1,则引发_应用程序_错误(-20634,“这次与另一个事件冲突”);如果结束;结束;结束Fraid not-2错误<代码>3 5 PLS-00103:在预期以下情况之一时遇到符号“选择”:开始函数pragma过程子类型current curso 7 4 PLS-00103:在预期以下情况之一时遇到符号“文件结束”:(begin case declare end exception exit for goto if loop mod null pragma raise return select update while
我会将我的代码作为答案,以便正确格式化它。您的帮助非常宝贵!此触发器无法防止以下情况:a)可能将TESTDATE更改为与其他时间冲突的更新,或b)并发插入(在单独的事务中)相互冲突。一种更简单、更健壮的方法(不使用触发器)可能是放置主键约束TESTDATE,以及强制其为120分钟倍数的检查约束。