Oracle SQL存储过程结构、异常处理示例

--  存储过程结结构。
--  EXCeption不是存储过程必须部分,可以用作本存储过程的异常处理,但如果没有异常处理,出了异常将会终止程序
CREATE PROCEDURE procedure_name ()
IS/AS
BEGIN
  -- ....
  EXCEPTION 
    -- ...
END;

--  PL/SQL代码块是什么? 
--  下面就是。
--  EXCeption不是PL/SQL必须部分,可以用作本PL/SQL代码块的异常处理,但如果没有异常处理,出了异常将会终止程序
BEGIN
  -- ....
  EXCEPTION 
    -- ...
END;

-- ======================================
----  昨天说,一个存储过程里可以有多个PL/SQL代码块
-- ======================================
--也就是说可以这样
CREATE PROCEDURE procedure_name ()
IS/AS
BEGIN
  -- .PL/SQL代码块 1:
       BEGIN
  -- .... 
     -- 此处出了异常,
    -- 因为作了处理,本代码块将不执行,但程序可以继续
    -- 也就是说  PL/SQL代码块2 ,PL/SQL代码块3还可以执行
          EXCEPTION --异常处理
    -- ...
       END;
       
      -- .PL/SQL代码块 2:
      BEGIN
      -- ....如果此处出了异常,
      -- 因为本PL/SQL 未做异常处理,那么就只有两种结果
      -- 1、存储过程有异常处理,可以处理这个异常,于存储过程的异常处理来说,只要进了这个异常,本PL/SQl代码做完异常处理后,程序也将无法继续
      -- 2、存储过程有异常处理但无法处理该异常,或者存储过程没有异常处理,程序出错,将无法继续执行
      -- 上面两种情况都会导致 ,程序无法继续,简单说, PL/SQL代码块3不会执行
       END;
      
       -- .PL/SQL代码块 3:
      BEGIN
        --...
          EXCEPTION
           --..
       END;
    -- ... 存储过程的异常处理 
  EXCEPTION 
    -- ...。。
END;

 eg:

DECLARE 
 v_my_err EXCEPTION;
 v_i INTEGER ;
BEGIN
   FOR v_i IN 1..10
      LOOP    
         BEGIN 
             IF v_i=3 THEN
                 RAISE v_my_err;
             ELSE 
                 dbms_output.put_line(v_i);
             END IF;
             EXCEPTION
                WHEN v_my_err THEN
                    dbms_output.put_line('我有异常处理,下面的继续');
         END;
         
         BEGIN 
             IF v_i=6THEN
                    dbms_output.put_line('我没有异常处理,出了异常下面的不执行');
                 RAISE v_my_err;
             ELSE 
                 dbms_output.put_line(v_i);
             END IF;
         END;
      END LOOP;
EXCEPTION
   WHEN OTHERS THEN 
       dbms_output.put_line('出了异常,结束');
END;

 

posted @ 2019-01-25 13:33  从前有座山,山上  阅读(405)  评论(0编辑  收藏  举报