-- 세션을 처음 연결하면 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;
*/
'Database > PLSQL' 카테고리의 다른 글
105 - [Oracle PL/SQL] Managing Code - dbms_ddl (0) | 2024.05.15 |
---|---|
104 - [Oracle PL/SQL] Managing Code - Obfuscation (0) | 2024.05.15 |
102 - [Oracle PL/SQL] Managing Code - plsql_ccflags (0) | 2024.05.14 |
101 - [Oracle PL/SQL] Managing Code - Introduction (0) | 2024.05.13 |
100 - [Oracle PL/SQL] Compiler - package dbms_warning (0) | 2024.05.12 |