【问题标题】:SQL trigger compiling but I get an errorSQL 触发器编译但我得到一个错误
【发布时间】:2016-03-21 16:22:23
【问题描述】:

我在 SQL 中创建了一个触发器,它编译正常,但是当我运行插入它时,我收到以下错误:

SQL Error: ORA-01403: no data found  
ORA-06512: at "EOCRIBIN.SHIPMENT_CAPACITY", line 5  
ORA-04088: error during execution of trigger 'EOCRIBIN.SHIPMENT_CAPACITY'  
01403. 00000 -  "no data found"  
*Cause:  No data was found from the objects.  
*Action: There was no data from the objects which may be due to end of fetch.

这里是触发器:

CREATE OR REPLACE TRIGGER Shipment_capacity
BEFORE INSERT or UPDATE on SHIPMENT_TYPE FOR EACH ROW
DECLARE 
  NOT_ENOUGH_CAPACITY EXCEPTION;
  WEIGHT INTEGER;
BEGIN

  SELECT VolumeCapacity
    INTO WEIGHT
    FROM shipment_type
   WHERE ShipmentType = :NEW.ShipmentType;

  IF WEIGHT > :new.WeightCapacity THEN
    RAISE NOT_ENOUGH_CAPACITY;
  END IF;

  EXCEPTION 
  WHEN NOT_ENOUGH_CAPACITY THEN
    RAISE_APPLICATION_ERROR(-200003,'Volume capacity exceeds weight limit');
END; 

该表由以下内容组成:

CREATE TABLE SHIPMENT_TYPE
(
    ShipmentType varchar(25) primary key, 
    VolumeCapacity INT, 
    WeightCapacity INT, 
    Temperature float
);

知道为什么会发生此错误吗?

【问题讨论】:

  • 你想用你的select 语句完成什么?如果ShipmentType 是主键,看起来您只想检查if :new.VolumeCapacity > :new.weightCapacity then。这似乎不是一个特别合理的检查。我猜你真的想查询一个不同的表来比较。
  • 认为这确实有效。我正在遵循一个示例,这就是我选择的原因,但这是有道理的欢呼

标签: sql oracle triggers sql-insert sqltransaction


【解决方案1】:

我认为您的选择查询没有返回任何内容。您可以使用

捕获异常
WHEN NO_DATA_FOUND THEN
     --whatever you want to do when the error appear
END;

【讨论】:

    猜你喜欢
    • 2014-01-04
    • 2016-10-16
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    相关资源
    最近更新 更多