【问题标题】:PLSQL EXCEPTION not workingPLSQL 异常不起作用
【发布时间】:2016-01-24 09:00:44
【问题描述】:

当过程未插入记录时,我试图引发异常。我的代码如下:

CREATE OR REPLACE PROCEDURE OPEN_CLASS(
    p_class IN TUTPRAC.CLASSID%TYPE,
    p_unitc IN TUTPRAC.UNITCODE%TYPE,
    p_classd IN TUTPRAC.CLASS_DAY%TYPE,
    p_classt IN TUTPRAC.CLASS_TIME%TYPE,
    p_classtp IN TUTPRAC.CLASS_TYPE%TYPE,
    p_roomnm IN TUTPRAC.ROOMNUM%TYPE)
IS
    -- Variables    
    x number:=0;
    y number:=0;  
    CLASS_CLASH EXCEPTION;
BEGIN
    -- checks
    SELECT nvl((SELECT 1 
                FROM TUTPRAC
                 WHERE UNITCODE = p_unitc and CLASS_DAY = p_classd 
                  or CLASS_DAY = p_classd and CLASS_TIME = p_classt
                  and ROOMNUM = p_roomnm) , 0) 
    INTO x FROM dual;
    SELECT nvl((SELECT 1 
                FROM UNITSTREAM 
                WHERE UNITCODE = p_unitc and DAY = p_classd 
                or DAY = p_classd and TIME = p_classt 
                and LOCATION = p_roomnm) , 0) 
    INTO y FROM dual;
    -- insert
    IF (x = 0 and y = 0) THEN
      INSERT INTO TUTPRAC (CLASSID, UNITCODE, CLASS_DAY, CLASS_TIME, CLASS_TYPE, ROOMNUM) 
      VALUES (p_class, p_unitc, p_classd, p_classt, p_classtp, p_roomnm);
    ELSE
      RAISE CLASS_CLASH;
    END IF;
EXCEPTION
      WHEN CLASS_CLASH THEN
        DBMS_OUTPUT.PUT_LINE('Record was not inserted due to a class clash.');
END OPEN_CLASS;

当我运行这个过程时,如果记录没有任何冲突,它会显示PL/SQL procedure successfully completed.,它会在表中添加一条记录。问题是,即使它发现冲突并且 没有 添加记录,它仍然会显示相同的消息,而不是我的异常的输出。

【问题讨论】:

标签: oracle exception plsql


【解决方案1】:

您可能没有在会话中执行set serveroutput on

您的代码将抛出异常,找不到数据。我认为您在没有匹配项时期待NULL,因此您使用了NVL。但是 select 语句不会返回任何内容,而不是您期望的 NULL

这是找不到数据异常的原因。

您可以使用count(*) into xcount(*) into y 代替NVL。它应该按预期工作。

【讨论】:

    【解决方案2】:

    由于您在过程中捕获了异常 - 过程不会异常终止。所以,PL/SQL procedure successfully completed. 是正确的输出。要使您的过程引发异常,您需要在 EXCEPTION 块中发出raise;

    如果您没有看到该消息,这可能是因为 DBMS_OUTPUT 输出被抑制。如果将DBMS_OUTPUT.put_line 作为过程的第一行,请检查是否看到任何输出。如果您不这样做 - 请在调用您的过程之前检查您是否在 sqlplus 会话中调用了 SET SERVEROUTPUT ON

    【讨论】:

      猜你喜欢
      • 2018-05-12
      • 2021-04-08
      • 2017-04-05
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      相关资源
      最近更新 更多