oracle异常处理

CREATE OR REPLACE PACKAGE BODY TEST_PACKAGE IS
--异常分为:编译是错误(语法错误)、运行时错误(编译器无法检查,对应某些情况程序是可以正常执行的,但在某些特点情况下程序不会正确执行)
--内置异常:oracle中把一些常见的运行时错误预定义为异常一个ora-xxxx表示一种错误。如:ora-01476表示zero_divide错误。内置异常是隐式抛出的,当发生
--           特定错误是,与该错误相关的内置异常就会抛出。
  PROCEDURE TEST_001 is
  begin
    TEST_002;
    EXCEPTION
        when value_error or invalid_number then
             dbms_output.put_line('2种异常中一种'||SQLERRM);
       WHEN OTHERS THEN
        dbms_output.put_line('error'||SQLERRM);
  end TEST_001;

  PROCEDURE TEST_002 is
    custTelephoneId nbz_cust_telephone.id_nbz_cust_telephone%type;
    begin
    SELECT SYS_GUID() into custTelephoneId FROM DUAL;
    insert into nbz_cust_telephone
      (id_nbz_cust_telephone,
       tele_type_code,
       id_nbz_customer,
       tele_num,
       is_current_dailed,
       is_default_contact)
    values
      (null,
       null,
       null,
       null,
       null,
       null);
       commit;
  end TEST_002;
  /*
  *  如果语句块中定义一个异常,该异常是本语句块专用的,但是该异常适用于该语句块包含的任何语句块。(在语句块嵌套的情况下,外包语句块定义的任何异常读适用于内部语句块)
  *  no_data_found异常适用于inner block当然也适用于outer block.而value_error异常只适用于inner block.这种内部异常传递给外部处理的过程叫异常传播。
  */
  PROCEDURE TEST_003 is
  v_status_code nbz_task.task_status_code%type;
  v_count number(10);
  --outer block
  begin
    select nt.task_status_code into v_status_code from nbz_task nt where nt.id_nbz_task='100254236';
    --inner block
    begin
          select 0 into v_count from nbz_task nt where nt.id_nbz_batch='I_20090212_0004'; --这个语句可能出现no_data_found异常
    exception
         when value_error or invalid_number or too_many_rows then
             dbms_output.put_line('3种异常中一种'||SQLERRM);
    end;
    EXCEPTION
       WHEN no_data_found THEN
        dbms_output.put_line('error'||SQLERRM);
  end TEST_003;
  /*
  *  自定义异常
  * 
  */
  PROCEDURE TEST_004 is
  v_count number(10) :=0;
  my_exception exception;
  begin
    select count(*) into v_count from nbz_task nt where nt.id_nbz_batch='I_20090212_0004';
    if v_count=0 then
       raise my_exception;--自定义异常要显示抛出。内置异常会隐式抛出的。
    end if;
    EXCEPTION
       WHEN my_exception THEN
        dbms_output.put_line('error'||SQLERRM);
  end TEST_004;
   /*
  *  声明部分的异常不会被处理
  *  需要把
  */
  PROCEDURE TEST_005 is
  begin
   declare--需要嵌套
   v_test_var char(3):='ABCDE';
    begin
      dbms_output.put_line('进来了...'||v_test_var);
      EXCEPTION
          WHEN invalid_number or value_error THEN
          dbms_output.put_line('error'||SQLERRM);--此处不会被处理。尽管在v_test_var定义部分会抛出value_error异常,但不会被这里处理
    end;
  EXCEPTION
          WHEN invalid_number or value_error THEN
          dbms_output.put_line('error'||SQLERRM);--在此处处理。 
  end TEST_005;

END TEST_PACKAGE;

你可能感兴趣的:(oracle异常处理)