ORACLE NO_DATA_FOUND的三种处理办法

时间:2016-06-14 02:08:01   收藏:0   阅读:630

Oracle中存储过程中,如果需要将表中的值赋给变量,一般采取这样的方式

SELECT col
INTO v_col
FROM t_table
WHERE condition

?如果找不到数据,就会有 数据找不到的异常

?

?

有三种方式解决

1. 普通的异常捕获的方式

2. 通过表关联left join的方式

3. 通过max的方式

?

方法1 语法:

?

  BEGIN
    SELECT col
    INTO v_col
    FROM t_table 
    WHERE condition
  EXCEPTION WHEN NO_DATA_FOUND THEN
       do something
  END;

?

方法2 语法:

?

?

select nvl(b.col,自定义的默认值) into v_col
from (select 1 rn from dual) a
left join (
    SELECT col,rownum rn
    FROM t_table
    WHERE condition
) b on a.rn=b.rn

?

?

方法3 语法:

?

SELECT max(col) INTO v_col
FROM t_table
WHERE condition

?

初始化数据

?

?

create table test_sj_salary
(
   id integer primary key,
   name varchar2(100),
   salary integer
);

truncate table test_sj_salary;

insert into test_sj_salary (ID, NAME, SALARY)
values (1, ‘张三‘, 5000);

commit;

?

三种方法的演示

?

declare 
  v_salary integer;
begin 
  --通过异常方式处理找不到数据
  begin
    select tss.salary into v_salary
    from test_sj_salary tss
    where tss.name=‘蒙牛‘;
  EXCEPTION WHEN NO_DATA_FOUND THEN
    v_salary := -1;
  end;
   
  dbms_output.put_line(‘Exception deal ‘||to_char(v_salary));
  
  --通过表关联的方式实现
  select nvl(b.salary,-2)  into v_salary
  from (select 1 rn from dual) a
  left join (
    select tss.salary,rownum rn
    from test_sj_salary tss
    where tss.name=‘伊利‘ 
  ) b on a.rn=b.rn;
  
  dbms_output.put_line(‘Table deal ‘||to_char(v_salary));
  
  --通过max方式处理
  select max(tss.salary) into v_salary
  from test_sj_salary tss
  where tss.name=‘光明‘;
  
  dbms_output.put_line(‘Max deal ‘||to_char(v_salary));
end;

?

笔者在日常使用中常用的为方法二。

?

?

?

?

原文:http://wodeguozili.iteye.com/blog/2304210

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!