Oracle ile package oluştururken kullanılan bir pragmadır SERIALLY_REUSABLE. Normal şartlarda bir package ile işlem yaparken, o session a ait package veriler UGA içinde oluşturulur. Ve o session için ilgili paket memory içinde tutulur. Bu nedenle bir package daha sonraki çağrılmlarda initialize edilmez ve ilgili bazı değerler baştan yenilenmez. Eğer memory kullanımını daha etkin hale getirmek, her çağrımda packege içindeki değerleri yeniden başlatmak isterseniz bu pragmayı kullanabilirsiniz. Aksi takdirde bir package bir session günlerce de kalabilir.
Bu pragma kullanılmadan bir package içindeki bir cursor bir session içinde kapanmadan daha sonraki çağrımlarda kullanılabilir. Aşağıda bunun bir örneği bulunmaktadır. incerement fonksiyonu bir session içinde çağrımlarda değerini korurken, bu pragma ile değerini korumayıp tekrar başlatılmaktadır. Detaylar için otn e bakabilirsiniz.
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as SYS
SQL> set serveroutput on;
SQL> drop package p;
Package dropped
SQL>
SQL> CREATE OR REPLACE PACKAGE p IS
2 i NUMBER := 0;
3 PROCEDURE increment;
4 END p;
5 /
Package created
SQL>
SQL> CREATE OR REPLACE PACKAGE BODY p IS
2 PROCEDURE increment IS
3 BEGIN
4 i := i + 1;
5 dbms_output.put_line('i = ' || i);
6 END;
7
8 END p;
9 /
Package body created
SQL> drop package p2;
Package dropped
SQL>
SQL> CREATE OR REPLACE PACKAGE p2 IS
2 PRAGMA SERIALLY_REUSABLE;
3 i NUMBER := 0;
4 PROCEDURE increment;
5 END p2;
6 /
Package created
SQL>
SQL> CREATE OR REPLACE PACKAGE BODY p2 IS
2 PRAGMA SERIALLY_REUSABLE;
3 PROCEDURE increment IS
4 BEGIN
5 i := i + 1;
6 dbms_output.put_line('i = ' || i);
7 END;
8 END p2;
9 /
Package body created
SQL> exec p.increment;
i = 1
PL/SQL procedure successfully completed
SQL> exec p.increment;
i = 2
PL/SQL procedure successfully completed
SQL> exec p2.increment;
i = 1
PL/SQL procedure successfully completed
SQL> exec p2.increment;
i = 1
PL/SQL procedure successfully completed
SQL>
No comments:
Post a Comment