Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 执行触发器时出现未知错误_Database_Oracle_Plsql_Triggers - Fatal编程技术网

Database 执行触发器时出现未知错误

Database 执行触发器时出现未知错误,database,oracle,plsql,triggers,Database,Oracle,Plsql,Triggers,我已经设置了一个insert/update触发器,它可以防止员工同时存在于两个表中。它可以捕获非法插入/更新,但在使用非法插入/更新测试触发器时,我还会收到另一个错误报告 这是我的密码: CREATE OR REPLACE TRIGGER check_foobar BEFORE INSERT OR UPDATE OF VarX ON FOOBAR FOR EACH ROW DECLARE counter NUMBER(38); BEGIN SELECT count(*)

我已经设置了一个insert/update触发器,它可以防止员工同时存在于两个表中。它可以捕获非法插入/更新,但在使用非法插入/更新测试触发器时,我还会收到另一个错误报告

这是我的密码:

CREATE OR REPLACE TRIGGER check_foobar
BEFORE INSERT OR UPDATE OF VarX ON FOOBAR
FOR EACH ROW
DECLARE
    counter NUMBER(38);
BEGIN  
    SELECT count(*)
    INTO counter
    FROM BARFOO
    WHERE VarX = :NEW.VarX
    GROUP BY VarX;

IF counter > 0 THEN 
    RAISE_APPLICATION_ERROR(-20001, 'This is an illegal insertion/update');
    END IF;

EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('TEST');

END;
/
错误ORA-06512和ORA-04088我不确定:

SQL> INSERT INTO DRIVER VALUES(2,  10345, 'AVAILABLE');

Error starting at line : 26 File @test.sql
In command -
INSERT INTO FOOBAR VALUES(2)
Error report -
ORA-20001: This is an illegal insertion/update
ORA-06512: at "HR.CHECK_FOOBAR", line 11
ORA-04088: error during execution of trigger 'HR.CHECK_FOOBAR'
当我为select语句添加异常处理程序时,我的触发器停止正常工作,非法插入也不会被阻止。但是执行错误被阻止了

更新:我已经在触发器中添加了一个group by和一个异常,所以现在触发器仍然使用异常处理程序,但是错误ORA-06512和ORA-04088仍然伴随着非法插入/更新

错误中提到的第11行是

GROUP BY VarX;

任何建议都将不胜感激。

ORA-04088错误意味着触发器有一个未处理的异常。您提出了一个应用程序错误,但没有处理它。您需要按照以下步骤处理此异常

CREATE OR REPLACE TRIGGER check_foobar
BEFORE INSERT OR UPDATE OF VarX ON FOOBAR
FOR EACH ROW
DECLARE
    counter NUMBER(38);
    BEGIN  
       SELECT count(*)
       INTO counter
       FROM BARFOO
       WHERE VarX = :NEW.VarX
       GROUP BY VarX;

    IF counter > 0 THEN 
       RAISE_APPLICATION_ERROR(-20001, 'This is an illegal insertion/update');
    END IF;

EXCEPTION 
   WHEN NO_DATA_FOUND THEN 
      DBMS_OUTPUT.PUT_LINE('TEST');
   WHEN OTHERS THEN
      IF SQLCODE = -20001 THEN
        -- do some logging
        RAISE;
      ELSE
        -- do some logging and any other actions you feel are needed.   Then depending on needs you can raise or not.

      END IF;
END;
/

这里没有问题,它按预期工作

Error starting at line : 26 File @test.sql
In command -
INSERT INTO FOOBAR VALUES(2)
这是指脚本中包含INSERT语句的行。它告诉你在这一点上提出了一个例外

Error report -
这显示了错误堆栈:

ORA-20001: This is an illegal insertion/update
这是引发的实际异常

ORA-06512: at "HR.CHECK_FOOBAR", line 11
ORA-04088: error during execution of trigger 'HR.CHECK_FOOBAR'

这些附加消息只是为了告诉您异常最初是在哪里引发的,在本例中,在第11行的触发器中,
RAISE\u APPLICATION\u ERROR
如您所料。请注意,触发器的行号是指触发器的可执行部分,因此在您的情况下,
声明
是第1行。

处理此异常是毫无意义的;它将撤消异常的目的,即停止插入或更新。另外,在同一块中不能有两个
异常
部分。很抱歉,这是一个输入错误,修复了该问题,因此它不是两个异常部分,而是多个捕获。捕获异常并显式引发它应该会阻止在处理和引发异常时出现未处理的异常,但仍然会停止插入记录。