【问题标题】:PLSQL - exception in a procedurePLSQL - 过程中的异常
【发布时间】:2019-01-30 08:15:39
【问题描述】:

在过程中使用异常。

插入语句的过程。

CREATE OR REPLACE PROCEDURE pSaveProductGroup (p_parentCode VARCHAR2, p_nameGroup VARCHAR2) IS

v_var "ProductGroups"."code"%type;
BEGIN

select p."code" into v_var
from "ProductGroups" p
where p."code"=p_parentCode;

if v_var is not null then

INSERT INTO "ProductGroups"
("parentCode","nameGroup")
VALUES(p_parentCode,p_nameGroup);
end if;

EXCEPTION
WHEN v_var is null then
dbms_output.put_line('Undefined group.');

END;

它应该在需要时打印异常。

Error: Error(18,12): PLS-00103: Encountered the symbol "IS" when expecting one of the following:     . then or

【问题讨论】:

    标签: oracle plsql exception-handling


    【解决方案1】:

    你可以这样做来捕捉异常。

    CREATE OR REPLACE PROCEDURE pSaveProductGroup (p_parentCode    VARCHAR2,
                                                   p_nameGroup     VARCHAR2)
    IS
       v_var   "ProductGroups"."code"%TYPE;
       myex    EXCEPTION;
       PRAGMA EXCEPTION_INIT (myex, -20016);
    BEGIN
       SELECT p."code"
         INTO v_var
         FROM "ProductGroups" p
        WHERE p."code" = p_parentCode;
    
       IF v_var IS NOT NULL
       THEN
          INSERT INTO "ProductGroups" ("parentCode", "nameGroup")
               VALUES (p_parentCode, p_nameGroup);
       ELSE
          IF (v_var IS NULL)
          THEN
             RAISE myex;
          END IF;
       END IF;
    EXCEPTION
       WHEN myex
       THEN
          DBMS_OUTPUT.put_line (
             'ERROR_STACK: "Undefined group --> ' || DBMS_UTILITY.format_error_stack);
       WHEN NO_DATA_FOUND
       THEN
          DBMS_OUTPUT.put_line (
             'ERROR_STACK: NO_DATA_FOUND --> ' || DBMS_UTILITY.format_error_stack);
       WHEN OTHERS
       THEN
          DBMS_OUTPUT.put_line (
             'ERROR_STACK: OTHERS --> ' || DBMS_UTILITY.format_error_stack);
    END;  
    

    程序的修改版本

    CREATE OR REPLACE PROCEDURE pSaveProductGroup (p_parentCode    VARCHAR2,
                                                   p_nameGroup     VARCHAR2)
    IS
       v_var   "ProductGroups"."code"%TYPE;
       myex    EXCEPTION;
       PRAGMA EXCEPTION_INIT (myex, -20016);
    BEGIN
       SELECT p."code"
         INTO v_var
         FROM "ProductGroups" p
        WHERE p."code" = p_parentCode;
    
       IF v_var IS NOT NULL
       THEN
          INSERT INTO "ProductGroups" ("parentCode", "nameGroup")
               VALUES (p_parentCode, p_nameGroup);
       ELSE
          RAISE myex;
       END IF;
    EXCEPTION
       WHEN myex
       THEN
          DBMS_OUTPUT.put_line (
             'ERROR_STACK: Undefined group --> ' || DBMS_UTILITY.format_error_stack);
       WHEN NO_DATA_FOUND
       THEN
          DBMS_OUTPUT.put_line (
             'ERROR_STACK: NO_DATA_FOUND --> ' || DBMS_UTILITY.format_error_stack);
       WHEN OTHERS
       THEN
          DBMS_OUTPUT.put_line (
             'ERROR_STACK: OTHERS --> ' || DBMS_UTILITY.format_error_stack);
    END;
    

    【讨论】:

    • 当我调用这个过程时:设置 serveroutput on begin pSaveProductGroup('G5','Group 13');结尾;它不打印异常。它打印 01403. 00000 - “找不到数据” *原因:从对象中找不到数据。 *操作:对象中没有数据,这可能是由于提取结束。
    • @user10966491 我已经更新了我的答案,重新执行该过程以找出错误详细信息。我怀疑您的 select 语句没有返回任何行。
    • 但我想在引发异常时打印“未定义组”。该怎么做?
    • @user10966491 IF (v_var IS NULL) 这个语句应该执行到RAISE Undefined group 异常。如果我错了,请纠正我。关键是程序中还有其他错误阻止执行捕获您的Undefined group。首先你需要找出哪个错误行有NO_DATA_FOUND
    • @user10966491 DBMS_UTILITY.format_error_stack 将提供有关错误的更多信息。
    猜你喜欢
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    相关资源
    最近更新 更多