Oracle Package中的包变量的使用(转)

转自:http://hi.baidu.com/andyloolu/blog/item/a64f0ed12cc10738960a165a.html

 在Oracle中,可以定义包变量。

      关于包变量的使用,不少的人不是很清楚。首先我们看如下的例子:

      CREATE OR REPLACE PACKAGE ds_test AS
          procedure proc1;
      END ds_test;
      /

      CREATE OR REPLACE PACKAGE BODY ds_test AS
       n number:=0;
       procedure proc1
       is
       begin
         n:=n+1;
          dbms_output.put_line('n='||n);
       end proc1;

      END ds_test;
    /

      执行如下的脚本,其输出的结果是什么呢?

      BEGIN
        DS_TEST.PROC1;
  
        DS_TEST.PROC1;
  
        DS_TEST.PROC1;
  
        DS_TEST.PROC1;
      END;

      呵呵执行结果是:

      n=1
      n=2
      n=3
      n=4

    这说明什么问题呢,这也就是说ORACLE中的Package酒相当于我们java中的一个class,在运行的时候被实例化,因此其中包变量就像是该实例中的实例变量一样。在Oracle中对包一个会话调用中,包变量是该会话中的“全局”变量。

     当然,在Oracle Package中,也可以定义包过程,其中很简单。比如将入行的包体修改一下:

       CREATE OR REPLACE PACKAGE BODY ds_test AS
       n number:=0;
       procedure proc1
       is
       begin
         n:=n+1;
          dbms_output.put_line('n='||n);
       end proc1;

       begin

            n:=n+100;

      END ds_test;
     /

      那么执行上述脚本后的结果是什么?

      执行后的结果是:

      n=101
      n=102
      n=103

      n=104

      由此可见,包过程是在一个会话中第一次调用时被执行,而在该会话中其他以后的调用中则不再被调用!

 

posted @ 2011-12-23 14:42  catch22  阅读(3359)  评论(0编辑  收藏  举报