16 September 2006

SERIALLY_REUSABLE Pragma On Creating Packages In Oracle

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: