본문 바로가기

Database/PLSQL

054 - [Oracle PL/SQL] Package - Persistent State

<샘플코드에서 사용한 데이터는 HR 스키마이고, 오라클 설치시 생성할 수 있는 기본 스키마 입니다>

 

 

 

 

 

해당 세션이 유지되는 동안,  패키지 내부의 변수가 값을 기억하고 있는 것을 의미한다.

아래 샘플코드는 패키지 내부에 변수를 선언하고 해당 변수에 입력받은 값을 저장하는 패키지 이다.

 

create or replace package Persistent_state
is
    g_var number:=10;
    procedure update_g_var ( p_no number); 
end;
/
create or replace package body Persistent_state
is
    procedure update_g_var ( p_no number)
    is 
    begin 
        g_var:=p_no;
        dbms_output.put_line(g_var);
    end;
end;

 

 

 

패키지 내부의 변수 g_var 에 저장된 값이 세션이 유지되는 동안에는 g_var 변수의 값도 유지가 된다.

그래서 새로운 변수에 할당하면 80이 저장되고 출력해보면 동일한 결과를 보인다.

 

execute Persistent_state.update_g_var(80);
variable test number;
execute :test:=Persistent_state.g_var;

print test
---------------------
      TEST
----------
        80



declare
    x number;
begin
    x:=Persistent_state.g_var;
    dbms_output.put_line (x);
end;

-----------------------------------------------------------------------------------
80

 

 

 

하지만 다른 세션으로 접속하면 값이 10으로 나온다.

 

declare
    x number;
begin
    x:=Persistent_state.g_var;
    dbms_output.put_line (x);
end;
---------------------------------
10

 

 

 

 

패키지 내부 변수값을 패키지 내부에서만 유지하고 싶다면 PRAGMA SERIALLY_REUSABLE 옵션을 사용하면된다.

 

# using PRAGMA SERIALLY_REUSABLE;
# 이렇게 처리하면 g_var 값은 해당 패키지 내부에서만 값을 유지한다.

create or replace package Persistent_state
is
    PRAGMA SERIALLY_REUSABLE;-- this is the main point.
    g_var number:=10;
    
    procedure update_g_var ( p_no number); 

end;
/
create or replace package body Persistent_state
is
    PRAGMA SERIALLY_REUSABLE;

    procedure update_g_var ( p_no number)
    is 
    
    begin 
        g_var:=p_no;
        dbms_output.put_line(g_var);
    end;

end;

 

 

 

이전과 다른 결과값이 나오는 것을 볼 수 있다.

 

execute Persistent_state.update_g_var(90);
variable test number;
execute :test:=Persistent_state.g_var;

print test
-------------
      TEST
----------
        10