Oracle 触发甲骨文:怎么了?

Oracle 触发甲骨文:怎么了?,oracle,plsql,database-trigger,datagrip,Oracle,Plsql,Database Trigger,Datagrip,这是我的代码: create trigger TriggerAdresse1 before INSERT on Adresse for each row declare enthaelt boolean; begin if ((Provinz in (select Name from Provinz2)) and (Laendercode in (select Laendercode from Provinz2))) then enthae

这是我的代码:

create trigger TriggerAdresse1
    before INSERT
    on Adresse
    for each row
declare
    enthaelt boolean;
begin
    if ((Provinz in (select Name from Provinz2)) and (Laendercode in (select Laendercode from Provinz2))) then
        enthaelt := true;
    end if;
    if(enthaelt:=false) then
        rollback;
    end if;
end;
如果属性Provinz或Laendercode不在表Provinz2中,我将尝试取消插入。
Datagrip说它是无效的

谢谢你的帮助!
致以最诚挚的问候

我认为您打算检查插入的值,因此您真的打算:

begin
    enthaelt := false;
    if ((:new.Provinz in (select Name from Provinz2)) and (:new.Laendercode in (select Laendercode from Provinz2))) then
        enthaelt := true;
    end if;
    if(enthaelt:=false) then
        rollback;
    end if;
end;
您还需要初始化变量

也就是说,实现此逻辑的正确方法是使用外键约束。令人遗憾的是,有人教你用扳机进行这项检查

Oracle中的布尔值可以有三个值:TRUE、FALSE和NULL,因为您没有初始化变量。 默认情况下,必须使用:new引用新值 默认情况下,触发器不能包含提交或回滚 您的代码必须是:

create trigger TriggerAdresse1
    before INSERT
    on Adresse
    for each row
declare
    enthaelt INTEGER;
begin

    SELECT COUNT(*)
    INTO enthaelt 
    FROM Provinz2
    WHERE Name = :new.Provinz
       AND Laendercode = :new.Laendercode;
    if enthaelt = 0 then
        RAISE_APPLICATION_ERROR(-20001, 'Provinz oder Ländercode ungültig');
    end if;
end;
但是,使用外键约束可以更好地实现您的需求

alter table Adresse add constraint Provinz_FK FOREIGN KEY (Provinz) 
  references Provinz2 (Name);

alter table Adresse add constraint Laendercode_FK FOREIGN KEY (Laendercode) 
  references Provinz2(Laendercode);
很可能Laendercode不是唯一的键,但Name+Laendercode是唯一的。那么就是这个,

alter table Adresse add constraint Provinz_FK FOREIGN KEY (Provinz, Laendercode) 
  references Provinz2 (Name, Laendercode);
如果enthaelt:=则为false 通过此语句,您的目的是执行比较,但是:=执行赋值。因此,无论何时进行比较,都应使用以下方法:

if(enthaelt=false) then

什么是Provinz?Provinz是AdresseDatagrip的一个属性,表示它无效。。。不是PL/SQL编译错误消息。但是在select中没有if x。。。PL/SQL中的语法。此外,如果条件周围没有括号,尽管它们不会导致编译错误,它们只会激怒PL/SQL程序员。此外,您不能在触发器中使用回滚。这将回滚整个事务,包括在触发语句之前所做的任何未提交的更改,这是不允许的,因为它可能导致混乱。你所能做的就是引发一个异常,这将导致插入失败并产生错误堆栈。谢谢你的评论,William!我们需要在DataGrip中创建检查:PL/SQL中的select构造中没有if var,即使您将其括在双括号中。@WilliamRobertson您是对的,我更正了我的代码。代码检查的一个很好的候选者!