在第33回中,虽然包装的构造只有规格部,但是例外的是,执行部可以在包装主体的最后记述,那个话将成为其他的机会。
我这次想说那个。
包实体部分的执行部,同一个会话中第一次调用包时会自动执行一次的执行部,后边再调用改包不会继续执行该执行部。
请看例子:
<1.包申明部>
SQL> CREATE OR REPLACE PACKAGE PAC1
2 IS
3 —第一次调用此包的日期和时间存放的变量
4
5 FirstCall DATE;
6 END;
7 /
包已创建。
【上述1的说明】
创建了PAC1包的申明部。
申明了一个DATE形式的变量FirstCall,目的是保存会话的时候第一次调用此包时的日期和时间。
备考:变量名的大小写没有区别
<2.包的实现(包的实体)>
SQL> CREATE OR REPLACE PACKAGE BODY PAC1
2 IS
3 --IS下面是申明部,这里没有申明的内容
4 --从以下BEGIN开始是实现的执行部(初始化块)
5 BEGIN
6 --把SYSDATE(当前日期)赋给包申明部的FirstCall变量(初始化)
7
8 FirstCall := SYSDATE;
9 END;
10 /
包实体创建完成。
【上述2的说明】
编写PAC1包装的实体(实现)部分。
从IS到BEGIN之间虽然是申明部,但是这次没有申明任何内容。
BEGIN的下面是语法执行部,这个部分是在会话(Session)中 自动执行一次的初始化的程序块。
这里是将SYSDATE函数的赋给FirstCall变量。
因此,PAC1.FirstCall变量,需要在会话中第一次调用该包的时点的时间进行初始化。
❤️.在会话1中>
SQL> SET SERVEROUTPUT ON
SQL> BEGIN
2 DBMS_OUTPUT.PUT_LINE(TO_CHAR(PAC1.FirstCall,‘yy/mm/dd hh24:mi:ss’));
3 END;
4 /
12/09/12 14:12:15 ←第一次调用包的时候,把调用时点的时间进行初始化了
PL/SQL过程成功完成。
SQL> R
1 BEGIN
2 DBMS_OUTPUT.PUT_LINE(TO_CHAR(PAC1.FirstCall,‘yy/mm/dd hh24:mi:ss’));
3* END;
12/09/12 14:12:15 ←在同一个会话中第二次执行,不再进行初始化该变量,所以值是相同的。
PL/SQL过程成功完成。
【上述3的说明】
在会话1中,在画面上显示了PAC1.FirstCall的值。
显示了两次,第一次调用包的时候启动了初始化块,这个时点的日期和时间被存储在PAC1.FirstCall中。
第二次未执行初始化块,PAC1.FirstCall变量的值没有变化。
<4.会话2> //需要重新连接数据库创建一个新的会话;
SQL> SET SERVEROUTPUT ON
SQL> BEGIN
2 DBMS_OUTPUT.PUT_LINE(TO_CHAR(PAC1.FirstCall,‘yy/mm/dd hh24:mi:ss’));
3 END;
4 /
12/09/1214:15:40←第一次调用包初始化被执行了
PL/SQL过程成功完成。
SQL> R
1 BEGIN
2 DBMS_OUTPUT.PUT_LINE(TO_CHAR(PAC1.FirstCall,‘yy/mm/dd hh24:mi:ss’));
3* END;
12/09/1214:15:40←由于在一个会话中,继续使用包不会执行第二次初始化块,所以值相同
PL/SQL过程成功完成。
【上述4的说明】
这是从别的画面连接的,或者新启动一个SQLPLUS开启新的会话。
同样参照PAC1.FirstCall变量的值,与会话1得值不同。
在同一个会话中连续显示两次,二次值是相同的。
也就是说,一次会话只启动一次初始化块。
【总结】
这就是包实体的初始化模块的作用。
本次到此结束