--pl/sql使用
--1.声明
--2.赋值
--3.操作
1.
declare
v_comm number(6,2);
begin
select nvl(comm,0) into v_comm from emp1
where lower(ename)='smith';
if v_comm!=0 then
update emp1 set comm=comm+100
where lower(ename)='smith';
else
update emp1 set comm=comm+200
where lower(ename)='smith';
end if;
end;
2.
declare
v_comm number(6,2);
begin
select nvl(comm,0) into v_comm from emp1
where lower(ename)='smith';
if v_comm != 0 then
update emp1 set comm = v_comm+100
where lower(ename) = 'smith';
else
update emp1 set comm = v_comm+200
where lower(ename) = 'smith';
end if;
commit;
end;
select * from emp1;
看上面的两段代码也许你觉得差不多,但实际上它们还是有不小的差别的,如果这个差别没有看出来那么你可能要费很大的周折才能解决这种问题就是在修改comm的时候使用的是comm=v_comm+200;而不是使用的comm=comm+200;因为如果那样做的话相当于是给null加上了200,结果还是null。
如下的两句语句可以证明这个观点:
select null+100 from dual;结果是空也就是null
select nvl(null,0)+100 from dual;这个结果是100;
实际上不仅是null跟数字运算的时候是这样的,而且跟字符串运算的时候也还是这个样子,所以在Oracle中null是需要特别先去判断,然后再做运算的,否则直接去运算就可能会得到跟你想象的不一样的结果。
类似的现象还有elsif,在使用多个分支的时候不可以使用else if而应该使用elsif这是规定,要想使用好一个东西必须要先把规则这些最基础的东西记清楚。