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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2个表上的Oracle触发器:未找到任何数据相关的知识,希望对你有一定的参考价值。

请帮助,我试图允许/禁止插入名为'vol'的表,该表具有来自另一个表'avion'的外键(id_av)

  • 允许插入:if airplane.state ='available'
  • 禁止它,如果它与'disponible'不同,因为我创建了这个触发器: 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时,它显示了这些错误enter image description here

我也尝试过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;
/ 

以上是关于2个表上的Oracle触发器:未找到任何数据的主要内容,如果未能解决你的问题,请参考以下文章

在主表上的数据库触发器中将数据插入临时表

两个不同表上的 ORACLE SQL 触发器或存储过程

在ORACLE触发器中想使用into 语句给一个变量赋值,但是查询出来的值可能为空,如何避免报错未找到任何数据

MySQL 5.5.30 级联触发器不起作用

Oracle - 未使用大表上的索引

如何在 Oracle SQL 中查找和过滤同一张表上的数据