ORACLE NO_DATA_FOUND的三种处理办法

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;

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

猜你喜欢

转载自wodeguozili.iteye.com/blog/2304210
今日推荐