본문 바로가기

Database/PLSQL

103 - [Oracle PL/SQL] Managing Code - plsql_ccflags 예시

 

 

-- 세션을 처음 연결하면 plsql_ccflags 값은 항상 널이다
SELECT name, value
FROM v$parameter
WHERE name ='plsql_ccflags' ;
/*
NAME                VALUE                         
------------------- ------------------------------
plsql_ccflags
*/


alter session set plsql_ccflags='trace_time:true,maxsizev:2000';


SELECT name, value
FROM v$parameter
WHERE name ='plsql_ccflags' ;
/*
NAME                VALUE                         
------------------- ------------------------------
plsql_ccflags       trace_time:true,maxsizev:2000
*/


create or replace procedure test_only
is
    v varchar2($$maxsizev);
begin
    if $$trace_time then
        dbms_output.put_line(to_char(sysdate,'hh:mi:ss') );
    end if;
    
    for i in 1..1000
    loop
        dbms_output.put_line($$maxsizev);
    end loop;
    
    
    if $$trace_time then
        dbms_output.put_line(to_char(sysdate,'hh:mi:ss') );
    end if;
    
end;


-- 실행시간과 값을 표시한다
exec test_only;
/*
03:27:20
2000
2000
....
2000
2000
03:27:20
*/

 

 

 

  • plsql_ccflags 값을 변경해야 할 경우는 어떻게 적용해야 할까?
--1. 값을 변경하고, 다시 컴파일
alter session set plsql_ccflags='trace_time:false,maxsizev:2000';

--2. 객체의 정보를 바로 변경하여, 컴파일이 필요없는 경우, 프로시져 직접변경
alter PROCEDURE  test_only compile PLSQL_CCFLAGS='trace_time:false,maxsizev:2000';


--1번으로 실행한 경우, 값을 변경해도 이미 컴파일된 객체에는 변화가 없다
exec test_only;

--그래서 컴파일을 다시하거나, 식제 객체의 값을 변경해야 한다
--컴파일을 다시하면,
create or replace procedure test_only
is
    v varchar2($$maxsizev);
begin
    if $$trace_time then
        dbms_output.put_line(to_char(sysdate,'hh:mi:ss') );
    end if;
    
    for i in 1..1000
    loop
        dbms_output.put_line($$maxsizev);
    end loop;
    
    
    if $$trace_time then
        dbms_output.put_line(to_char(sysdate,'hh:mi:ss') );
    end if;
    
end;


--해당 정보가 변경된 것을 확인 가능함
select name, type, plsql_ccflags
from user_plsql_object_settings
where lower(name)='test_only';
/*
NAME                 TYPE       PLSQL_CCFLAGS                           
-------------------- ---------- ----------------------------------------
TEST_ONLY            PROCEDURE  trace_time:false,maxsizev:2000 
*/


--이번에는 시간은 표시되지 않고 값만 표시된다.
exec test_only;
/*
2000
2000
....
2000
2000
*/

 

 

 

  • '$$토큰' 값을 실제 값으로 치환하기
--프로시져의 소스코드를 출력하면서 '$$토큰' 값을 실제 값으로 치환하기
call dbms_preprocessor.print_post_processed_source
('procedure', 'hr','test_only');
/*
procedure test_only
is
    v varchar2( 2000     );
begin
    if  FALSE       then
        dbms_output.put_line(to_char(sysdate,'hh:mi:ss') );
    end if;

    for i in 1..1000
    loop
        dbms_output.put_line( 2000     );
    end loop;


    if  FALSE       then
        dbms_output.put_line(to_char(sysdate,'hh:mi:ss') );
    end if;

end;
*/