首页 > 解决方案 > 在oracle中触发和插入数据的问题

问题描述

我在尝试将数据插入表时遇到了触发器问题

CREATE OR REPLACE TRIGGER OGRANICZ
BEFORE INSERT ON BILET
FOR EACH ROW 
DECLARE 
counter NUMBER(6);
check NUMBER(6);
BEGIN
SELECT id_seans INTO counter FROM seans WHERE id_seans=:NEW.id_seans AND EXTRACT(YEAR FROM data) = 2020;
SELECT COUNT(*) INTO counter FROM BILET B WHERE B.id_seans=:NEW.id_seans;
IF (check = :NEW.id_seans  AND counter >=3) THEN 
RAISE_APPLICATION_ERROR(-20001, 'too many');
ELSIF(check <> :NEW.id_seans AND counter >=2) THEN 
RAISE_APPLICATION_ERROR(-20002, 'too many');
END IF;
END;

我必须为我的表设置限制,我不能添加到 bilet 表中 id_seans 具有相同值的许多值。当我为 id_seans 的第一个值添加太多值时,它会起作用。但是,如果我尝试为其他 id_seans 添加任何值,则会出现这样的错误

ORA-01403: no data found ORA-06512: at "SQL_OXRLEFMPXILAXVNAWVBOUVDFO.OGRANICZ", line 6
ORA-06512: at "SYS.DBMS_SQL", line 1721

标签: oracleplsqltriggers

解决方案


NO_DATA_FOUND异常可能只因第一个 SELECT 语句而引发,而第二个语句在任何情况下都返回一个从零开始的整数。因此,以这样的方式处理第一个异常就足够了

BEGIN
   SELECT id_seans 
     INTO counter 
     FROM seans 
    WHERE id_seans=:new.id_seans 
      AND EXTRACT(YEAR FROM data) = 2020;
 EXCEPTION WHEN NO_DATA_FOUND THEN NULL;
END;

推荐阅读