본문 바로가기

Database/PLSQL

102 - [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='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
*/