Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1693527
  • 博文数量: 136
  • 博客积分: 10021
  • 博客等级: 上将
  • 技术积分: 3261
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-22 11:26
文章分类

全部博文(136)

文章存档

2010年(1)

2009年(26)

2008年(109)

我的朋友

分类: Oracle

2008-04-11 14:58:17

这里是培训时使用到的一些例子:

 

/*################################################

试验6.2.1 :测试程序中的NULL

################################################*/

/************************************************

测试一:NULL的初级认识

************************************************/

SQL> set serveroutput on

SQL> declare

  2    v_1 varchar2(10);

  3  begin

  4    if v_1 is null then

  5      dbms_output.put_line('v_1 is null');

  6    end if;

  7* end;

SQL> /

v_1 is null

 

PL/SQL 过程已成功完成。

 

SQL>

 

/************************************************

测试二:NULL只能用“IS”来判断,而不能用“=

************************************************/

SQL> declare

  2    v_1 varchar2(10);

  3  begin

  4    if v_1 = null then

  5      dbms_output.put_line('v_1 is null');

  6    end if;

  7* end;

SQL> /

 

PL/SQL 过程已成功完成。

 

SQL>

 

/************************************************

测试三:字符串拼接中如果有NULL,不受影响

************************************************/

SQL>declare

  2    v_1 varchar2(10);

  3    v_2 varchar2(10);

  4    v_3 varchar2(10);

  5  begin

  6    v_2 := 'adsf';

  7    v_3 := v_2 || v_1;

  8    dbms_output.put_line('v_3 :' || v_3);

  9* end;

SQL> /

v_3 :adsf

 

PL/SQL 过程已成功完成。

 

SQL>

 

/************************************************

测试三补充:

       字符变量中的''就是NULL

       NULL是可以被赋值的

************************************************/

SQL> declare

  2    v_1 varchar2(10);

  3  begin

  4    v_1 := '';

  5    if v_1 is null then

  6      dbms_output.put_line('v_1 is null');

  7    end if;

  8* end;

SQL> /

v_1 is null

 

PL/SQL 过程已成功完成。

 

SQL> declare

  2    v_1 varchar2(10);

  3  begin

  4    v_1 := null;

  5    if v_1 is null then

  6      dbms_output.put_line('v_1 is null');

  7    end if;

  8* end;

SQL> /

v_1 is null

 

PL/SQL 过程已成功完成。

 

SQL>

 

/************************************************

测试四:NULL的数值运算会导致结果为NULL

************************************************/

SQL> declare

  2    n_1 number(10);

  3    n_2 n_1%type;

  4    n_3 n_2%type;

  5  begin

  6    n_2 := 999;

  7    n_3 := n_1 + n_2;

  8    if n_3 is null then

  9      dbms_output.put_line('n_3 is null');

 10    else

 11      dbms_output.put_line('n_3 is not null');

 12    end if;

 13* end;

SQL> /

n_3 is null

 

PL/SQL 过程已成功完成。

 

SQL>

 

/*################################################

试验6.2.2 :测试数据中的NULL——这是最容易出现的问题。

################################################*/

/************************************************

测试一:从表test4中取出数据,保存到变量v_grade中。由于数据为NULL,导致变量为NULL

SQL> select * from test4 where score=66;

 

     SCORE GRADE

----------------- ----------------

        66

 

SQL>

************************************************/

SQL> declare

  2    v_grade test4.grade%type;

  3  begin

  4    select grade

  5      into v_grade

  6      from test4

  7     where score = 66;

  8    if v_grade is null then

  9      dbms_output.put_line('v_grade is null');

 10    end if;

 11* end;

SQL> /

v_grade is null

 

PL/SQL 过程已成功完成。

 

/************************************************

测试二:自己实现NVL函数

 

结论:记得使用函数NVL

************************************************/

create or replace function fun_my_nvl( prm_old_value IN VARCHAR2,

                                       prm_new_value IN VARCHAR2 ) return varchar2

IS

begin

  IF prm_old_value IS NULL THEN

    RETURN prm_new_value;

  ELSE

    RETURN prm_old_value;

  END IF;

end fun_my_nvl;

 

/************************************************

测试三:总结:在程序中小心地避免NULL

************************************************/

SQL> declare

  2    v_grade test4.grade%type;

  3  begin

  4    select nvl(grade, 'E')

  5      into v_grade

  6      from test4

  7     where score = 66;

  8    if v_grade is null then

  9      dbms_output.put_line('v_grade is null');

 10    end if;

 11    dbms_output.put_line('v_grade:' || v_grade);

 12  end;

 13  /

v_grade:E

 

PL/SQL 过程已成功完成。

 

SQL>

/*################################################

试验6.3:测试goto + null => continue

 

目的:求100以内的奇数和

################################################*/

declare

  n_sum number(10) := 0;

begin

  for n_number in 1..100 loop

    if mod(n_number, 2) = 0 then

      goto next_loop;

    end if;

    n_sum := n_sum + n_number;

    <>

    null;

  end loop;

  dbms_output.put_line(n_sum);

end;

 

阅读(1216) | 评论(0) | 转发(0) |
0

上一篇:关于NULL(1)

下一篇:关于NULL(4)

给主人留下些什么吧!~~