• [bbk5300]第17集 Chapter 08 Handling Exceptions(00)


    Objectives

    After completing this lesson,you should be able to do the following:

    • Define PL/SQL execeptions
    • Recognize unhandled exceptions
    • List and use different types of PL/SQL execption handlers
    • Trap unanticipated errors.
    • Describe the effect of exception propagation in nested blocks
    • Customize PL/SQL exception messages

    Agenda

    • Understanding PL/SQL exceptions
    • Trapping exceptions

    What is an exception ? 

    无任何异常处理模块
    DECLARE
            v_lname VARCHAR(35);
    BEGIN
            SELECT last_name INTO v_lname
            FROM employees
            WHERE first_name = 'John';
    
            DBMS_OUTPUT.PUT_LINE('John`s last name is :' || v_lname);
    END;
    
    /
    SQL> @1.sql
    DECLARE
    *
    ERROR at line 1:
    ORA-01422: exact fetch returns more than requested number of rows
    ORA-06512: at line 4
    添加异常处理模块
    SET SERVEROUT ON;
    DECLARE
            v_lname VARCHAR(35);
    BEGIN
            SELECT last_name INTO v_lname
            FROM employees
            WHERE first_name = 'John';
    
            DBMS_OUTPUT.PUT_LINE('John`s last name is :' || v_lname);
    EXCEPTION
            WHEN OTHERS THEN
                    DBMS_OUTPUT.PUT_LINE('ERROR OCCURED : returned more than one rows!');
    END;
    
    /
    SQL> @1.sql
    ERROR OCCURED : returned more than one rows!
    
    PL/SQL procedure successfully completed.
    添加标准化异常处理模块
    SET SERVEROUT ON;
    DECLARE
            v_lname VARCHAR(35);
    BEGIN
            SELECT last_name INTO v_lname
            FROM employees
            WHERE first_name = 'John';
    
            DBMS_OUTPUT.PUT_LINE('John`s last name is :' || v_lname);
    EXCEPTION
            WHEN TOO_MANY_ROWS THEN
                    DBMS_OUTPUT.PUT_LINE('Your select statement retrieved multiple rows.Consider using a cursor.!');
    END;
    
    /
    SQL> @1_1.sql
    Your select statement retrieved multiple rows.Consider using a cursor.!
    
    PL/SQL procedure successfully completed.
    添加万能异常处理句柄
    SET SERVEROUT ON;
    DECLARE
            v_lname VARCHAR(15);
    BEGIN
            SELECT last_name INTO v_lname
            FROM emp
            WHERE first_name = 'John';
    
            DBMS_OUTPUT.PUT_LINE('John`s last name is :' || v_lname);
    EXCEPTION
            WHEN TOO_MANY_ROWS THEN
                    DBMS_OUTPUT.PUT_LINE('Your select statement retrieved multiple rows.Consider using a cursor.!');
            WHEN OTHERS THEN
                    DBMS_OUTPUT.PUT_LINE('You meet an error!');
    END;
    
    /
    SQL> @1_1
    You meet an error!
    
    PL/SQL procedure successfully completed.

    Handling the exception : Example(up look)

    TOO_MANY_ROWS等异常类型总结.

    PL/SQL Block Structure

    DECLARE(optional)

      -Variables,cursors,user-defined exceptions

    BEGIN(mandatory)

      -SQL statements

      -PL/SQL statements

    EXCEPTION(optional)

      -Action to perform when execptions occur

    END;(mandatory)

    Understanding Exceptions with PL/SQL

    • An exception is a PL/SQL error that is raised during program execution.
    • An exception can be raised:
      • -Implicitly by the Oracle Server
      • -Explicitly by the program
    • An exception can be handled:
      • -By trapping it with a handler
      • -By propagating it to the calling enviroment

    Handing Exceptions

    Understanding Exceptions with PL/SQL

    • When an error occurs in PL/SQL,an exception is raised.The processing in the current PL/SQL block`s execution section halt,and control is transferred to the separate exception section of the current block,if one exists,to handle the exception.
    • You cannot return to that block after you finish handling the exception.Instead,control is passed to the enclosing block,if any.

     图解:

    示例证明:只要进入到异常处理模块,即使使用GOTO也不能回到正常PL/SQL块
    DECLARE
            v_lname VARCHAR2(15);
    BEGIN
            SELECT last_name INTO v_lname
            FROM emp
            WHERE first_name = 'John';
    
            DBMS_OUTPUT.PUT_LINE('John`s last name is :' || v_lname);
            <<welcomback>>
            DBMS_OUTPUT.PUT_LINE('Welcom back!');
    EXCEPTION
            WHEN TOO_MANY_ROWS THEN
                    DBMS_OUTPUT.PUT_LINE('Your select statement retrieved multiple rows.Consider using a cursor.');
            WHEN OTHERS THEN
                    DBMS_OUTPUT.PUT_LINE('1:You meet an error!');
                    --GOTO welcomback;
                    GOTO gohere;
                    DBMS_OUTPUT.PUT_LINE('2:You are to die!');
                    <<gohere>>
                    DBMS_OUTPUT.PUT_LINE('3:You will be ended!');
    END;
    
    /
  • 相关阅读:
    Ajax beforeSend和complete 方法与防止重复提交
    tablesorter周边文档
    对委托的一些短浅理解
    Nginx核心要领五:worker_processes、worker_connections设置
    二进制安装k8s 教程
    安装 Docker Engine-Community
    centos7.x 安装 NodeJS、yarn、pm2
    cfssl
    k8s各个进程 占用内存大小
    Linux下查看某一进程所占用内存的方法
  • 原文地址:https://www.cnblogs.com/arcer/p/3039762.html
Copyright © 2020-2023  润新知