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;
笔者在日常使用中常用的为方法二。