2个表上的Oracle触发器:未找到数据

2个表上的Oracle触发器:未找到数据,oracle,plsql,triggers,Oracle,Plsql,Triggers,请帮助,我正在尝试允许/禁止插入到名为“vol”的表中,该表具有来自另一个表“avion”的外键id_av 允许插入:如果avion.etat='disponable' 如果它与“可争议”不同,则禁止它 为此,我创建了此触发器: create or replace trigger t before insert on vol declare etat VARCHAR(10); BEGIN select avion.etat into etat from vol,etat where avi

请帮助,我正在尝试允许/禁止插入到名为“vol”的表中,该表具有来自另一个表“avion”的外键id_av

允许插入:如果avion.etat='disponable' 如果它与“可争议”不同,则禁止它 为此,我创建了此触发器:

create or replace trigger t
before insert on vol 
declare etat VARCHAR(10);
BEGIN 
select avion.etat into etat 
from vol,etat
where avion.id_av = vol.id_av;
IF(etat <> 'disponible') 
THEN 
RAISE_APPLICATION_ERROR( -20001, 'insertion imposible');
END IF;
END t;
/ 
结果:触发器被创建,但当我尝试在vol中插入时,它会显示这些错误


我也尝试过JOIN..ON,但没有真正成功

也许是这样的

create or replace trigger t
  before insert on vol 
  for each row          --> edited
declare 
  etat VARCHAR(10);
BEGIN 
  -- MAX will prevent NO-DATA-FOUND 
  -- Also, you don't need join - use :NEW.ID_AV which is equal to currently inserted value
  select max(avion.etat)
  into etat 
  from avion
  where avion.id_av = :new.id_av;

  -- NVL because - if SELECT returns, nothing, you can't compare NULL with 'disponible'
  IF nvl(etat, 'x') <> 'disponible'
  THEN 
    RAISE_APPLICATION_ERROR( -20001, 'insertion imposible');
  END IF;
END t;
/ 

也许是这样的

create or replace trigger t
  before insert on vol 
  for each row          --> edited
declare 
  etat VARCHAR(10);
BEGIN 
  -- MAX will prevent NO-DATA-FOUND 
  -- Also, you don't need join - use :NEW.ID_AV which is equal to currently inserted value
  select max(avion.etat)
  into etat 
  from avion
  where avion.id_av = :new.id_av;

  -- NVL because - if SELECT returns, nothing, you can't compare NULL with 'disponible'
  IF nvl(etat, 'x') <> 'disponible'
  THEN 
    RAISE_APPLICATION_ERROR( -20001, 'insertion imposible');
  END IF;
END t;
/ 

我尝试了您的建议,但它显示了一个错误:表级triggerRight中不允许使用新的或旧的引用;我错过了每一排的比赛;看看编辑过的代码,这是第三行。我尝试了你的建议,结果显示了一个错误:表级triggerRight中不允许使用新的或旧的引用;我错过了每一排的比赛;看看编辑过的代码,这是第三行。