- plsql_ccflags 값 설정 및 조회
SELECT name, value
FROM v$parameter
WHERE name ='plsql_ccflags' ;
/*
NAME VALUE
------------------- ------------------------------
plsql_ccflags
*/
alter session set plsql_ccflags='language:1';
SELECT name, value
FROM v$parameter
WHERE name ='plsql_ccflags' ;
/*
NAME VALUE
------------------- ------------------------------
plsql_ccflags language:1
*/
--to print this directive
begin
dbms_output.put_line($$language);
dbms_output.put_line($$plsql_ccflags);
end;
/*
1
language:1
*/
- 사용 예시
--to use it in PLSQL code
create or replace function get_curr_lang
return varchar2
is
v_lang varchar2(100);
begin
v_lang:='the curr language in system is '||
$if $$language=1 $then 'English'
$else 'Arabic'
$end;
return v_lang;
end;
select get_curr_lang from dual;
/*
GET_CURR_LANG
-------------------------------------------
the curr language in system is English
*/
- PLSQL_CCFLAGS값이 실제 객체에 저장되는 과정
-- 컴파일 당시의 PLSQL_CCFLAGS 값이 객체에 저장된다
select name, type, PLSQL_OPTIMIZE_LEVEL as OPT_level, PLSQL_CODE_TYPE,PLSQL_WARNINGS, plsql_ccflags
from user_plsql_object_settings
where lower(name)='get_curr_lang';
/*
NAME TYPE OPT_LEVEL PLSQL_CODE_TYPE PLSQL_WARNINGS PLSQL_CCFLAGS
-------------------- ---------- ---------- --------------- -------------------- --------------------
GET_CURR_LANG FUNCTION 2 INTERPRETED DISABLE:ALL language:1
*/
--PLSQL_CCFLAGS값을 변경해보자
alter session set plsql_ccflags='language:2';
--설정이전에 만들어진 객체들의 정보는 변경되지 않으므로, 컴파일을 다시해야 PLSQL_CCFLAGS 정보가 변경된 것을 확인 가능함
select name, type, PLSQL_OPTIMIZE_LEVEL as OPT_level, PLSQL_CODE_TYPE,PLSQL_WARNINGS, plsql_ccflags
from user_plsql_object_settings
where lower(name)='get_curr_lang';
/*
NAME TYPE OPT_LEVEL PLSQL_CODE_TYPE PLSQL_WARNINGS PLSQL_CCFLAGS
-------------------- ---------- ---------- --------------- -------------------- --------------------
GET_CURR_LANG FUNCTION 2 INTERPRETED DISABLE:ALL language:1
*/
-- 컴파일을 다시하면 PLSQL_CCFLAGS 값이 변한다.
create or replace function get_curr_lang
return varchar2
is
v_lang varchar2(100);
begin
v_lang:='the curr language in system is '||
$if $$language=1 $then 'English'
$else 'Arabic'
$end;
return v_lang;
end;
--컴파일을 다시하니 객체에도 변경된 PLSQL_CCFLAGS 값이 저장된다
select name, type, PLSQL_OPTIMIZE_LEVEL as OPT_level, PLSQL_CODE_TYPE,PLSQL_WARNINGS, plsql_ccflags
from user_plsql_object_settings
where lower(name)='get_curr_lang';
/*
NAME TYPE OPT_LEVEL PLSQL_CODE_TYPE PLSQL_WARNINGS PLSQL_CCFLAGS
-------------------- ---------- ---------- --------------- -------------------- --------------------
GET_CURR_LANG FUNCTION 2 INTERPRETED DISABLE:ALL language:2
*/
- PLSQL_CCFLAGS값이 변경되었으므로 함수를 실행하면 이전과 다른값을 리턴함
select get_curr_lang from dual;
/*
GET_CURR_LANG
--------------------------------------
the curr language in system is Arabic
*/
- plsql_ccflags 값이 중복된 경우 - 오른쪽 중복값이 최종값이다
-- 중복된 값은 오른쪽에 있는 값이 최종값이 된다
alter session set plsql_ccflags='plsql_ccflags:true,debug:true,debug:0';
SELECT name, value
FROM v$parameter
WHERE name ='plsql_ccflags' ;
/*
NAME VALUE
-------------------- ----------------------------------------
plsql_ccflags plsql_ccflags:true,debug:true,debug:0
*/
begin
dbms_output.put_line ($$plsql_ccflags);
end;
/*
--값이 boolean 변수이므로 오류가 발생한다
Error report -
ORA-06550: line 2, column 5:
PLS-00306: wrong number or types of arguments in call to 'PUT_LINE'
ORA-06550: line 2, column 5:
PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
*/
begin
if $$plsql_ccflags then
dbms_output.put_line('plsql_ccflags value is true');
end if;
if $$debug=0 then
dbms_output.put_line('debug value is 0');
end if;
--경고메시지가 모두 비활성 상태이므로 없는 파라미터를 출력하려고 해도 경고메시지가 없음
dbms_output.put_line($$ddfdfgf);
end;
/*
plsql_ccflags value is true
debug value is 0
*/
- 경고 메시지는 서브프로그램에서만 적용 (anonymous block에서는 표시되지 않는다)
-- 경고메시지를 모두 활성화시킨다.
alter session set plsql_warnings='enable:all'
--now it should give warning, but it will not
--the warning only in subprograms
begin
if $$plsql_ccflags then
dbms_output.put_line('plsql_ccflags value is true');
end if;
if $$debug=0 then
dbms_output.put_line('debug value is 0');
end if;
--anonymous block 에서는 경고가 출력되지 않는다
dbms_output.put_line($$ddfdfgf);
end;
--프로시져 컴파일할때 참고하는 파라미터값은 아래와 같다.
select name, value FROM v$parameter
WHERE name ='plsql_ccflags' ;
/*
NAME VALUE
-------------------- ----------------------------------------
plsql_ccflags plsql_ccflags:true,debug:true,debug:0
*/
--서브프로그램에서는 오류가 발생하는지 확인해보자.
create or replace procedure cc
is
begin
if $$plsql_ccflags then
dbms_output.put_line('plsql_ccflags value is true');
end if;
if $$debug=0 then
dbms_output.put_line('debug value is 0');
end if;
dbms_output.put_line($$ddfdfgf);
end;
/*
LINE/COL ERROR
--------- -------------------------------------------------------------
1/1 PLW-05018: unit CC omitted optional AUTHID clause; default value DEFINER used
11/26 PLW-06003: unknown inquiry directive '$$DDFDFGF'
*/
- v$parameter에 있는 이름을 plsql_ccflags에 저장하는 경우 - 검색 우선순위
- plsql_code_type 값을 plsql_ccflags 에 저장하면 검색 순서는 어떻게 될것인가?
--value 는 널이다
SELECT name, value
FROM v$parameter
WHERE name ='plsql_ccflags' ;
/*
NAME VALUE
------------------- ------------------------------
plsql_ccflags
*/
SELECT name, value
FROM v$parameter
WHERE name ='plsql_code_type' ;
/*
NAME VALUE
------------------- ------------------------------
plsql_code_type INTERPRETED
*/
--the values in plsql_ccflags could be pls_integer,boolean, null
alter session set plsql_ccflags='language:1,language:null,plsql_code_type:10';
--plsql_code_type 값을 plsql_ccflags 에 저장하면 검색 순서는 어떻게 될것인가?
-- v$parameter에서 검색할때는 name값을 기초로 검색함, plsql_ccflags 값에서 찾지않는다.
SELECT name, value
FROM v$parameter
WHERE name ='plsql_code_type' ;
/*
NAME VALUE
------------------- ------------------------------
plsql_code_type INTERPRETED
*/
--아래처럼 $$로 접근하면 plsql_ccflags에서 먼저 조회하고 있으면 불러오고 없으면 name 컬럼에서 찾음
--plsql_code_type값은 plsql_ccflags에 있으서 10을 반환하고
--plsql_warnings값은 plsql_ccflags에 없어서 v$parameter 에 있는 값을 반환
begin
dbms_output.put_line($$language);
dbms_output.put_line($$plsql_code_type);
dbms_output.put_line($$plsql_warnings);
end;
/*
(null)
10
ENABLE:ALL
*/
'Database > PLSQL' 카테고리의 다른 글
104 - [Oracle PL/SQL] Managing Code - Obfuscation (0) | 2024.05.15 |
---|---|
103 - [Oracle PL/SQL] Managing Code - plsql_ccflags 예시 (0) | 2024.05.15 |
101 - [Oracle PL/SQL] Managing Code - Introduction (0) | 2024.05.13 |
100 - [Oracle PL/SQL] Compiler - package dbms_warning (0) | 2024.05.12 |
099 - [Oracle PL/SQL] Compiler - Warnings (0) | 2024.05.12 |