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