上次介绍了使用包进行过程或者函数的重载:也就是参数不同,可以定义名字相同的子程序(程序、函数)。
本章继续介绍包的例外的可以实现的功能:“包变量的持久性”功能。
简单来首就是,在包中声明的变量,赋给他的值将在会话期间一致保持。
例如,向PAC1包装的申明部定义A这个变量。
CREATE OR REPLACE PACKAGE PAC1
IS
A NUMBER;
END;
这里的变量A在PAC1包装的申明部已声明,用户或外部应用程序可以直接参照使用这个变量PAC1.A。
如果在无名的PL/SQL块中,把10赋给这个变量
BEGIN
PAC1.A := 10;
END;
这样的话,即使这个无名PL/SQL块的执行结束了,这个PAC1.A变量的值也会一直保留到会话结束为止。
因此,如果从SQL*Plus等中执行以下无名PL/SQL块,则会显示PAC1.A的值,即“10”。(此处将处理的会话称为会话1) 、
BEGIN
DBMS_OUTPUT.PUT_LINE(PAC1.A);
END;
执行上面的块时,请在“SET SERVEROUT OUT ON”可显示画面后再执行。
那么,SQL*Plus上就会显示"10"。
也就是说,即使第一个无名的PL/SQL块的执行结束,PAC1.A的值10仍保留。
此时,假设在另一个会话中(此处将会话称为会话2),将20的值代入PAC1.A中。
但是这对会话1没有任何影响。
从会话1来看,PAC1.A变量始终保持为10。
但是,从会话2来看,PAC1.A变量保持着20。
也就是说,包变量即使是同一包的同名变量的值,会在每次会话中存在,直到会话结束为止。
通常,在PL/SQL的块内的申明部中申明的变量,该块的执行结束后,该变量也就从存储器中消失了。
但是,在包中声明的变量一旦使用了那个包,即使使用了那个变量的PL/SQL块结束了,
该包的变量的值也会在会话结束前一直保留在存储器中。
后边再利用这个值的话,就很方便了。这个功能有各种各样的用途。
例如,
1,将在某个过程中处理的结果暂时存储在包的变量中,之后,另一程序可以使用该变量的值继续进行其他处理。
2,数据库触发器程序:
触发器程序:对某个特定的表进行更新处理时,需要后台自动启动并执行某些固定的程序,这成为触发器程序。
这个数据库触发器程序与过程和函数是不同的,他没有没有参数。
因此,如果想把某个值交给触发器的话,就可以使用包的变量来实现这个功能。
总而言之,包变量得值一直会保留再当前会话中,直至会话结束。
但有时,我们不希望在会话中一直保存变量:可能回浪费内存。
这种情况下需要如下定义:可以如下使用关键字:“PRAGMA SERIALLY REUSABLE”。
这样使用该变量,PL/SQL块结束后,该变量得值也会随之消失。
是不是很神奇,是不是很惊讶。Let’s go,Just Do it!