2019独角兽企业重金招聘Python工程师标准>>>
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;