본문 바로가기

Database/PLSQL

101 - [Oracle PL/SQL] Managing Code - Introduction

버전이 다른 오라클 서버들에 모두 적용가능한 하나의 코드를 만들어야 할 경우가 있습니다.

특정옵션들은 하위버전에서 동작하지 않게 때문에 컴파일 옵션을 다르게 적용할 필요가 있습니다.

 

아래 그림처럼 특정옵션은 버전마다 지원 여부가 다릅니다.

 

 

 

$ 기호를 이용해서 조건문을 만들수 있고 $$ 기호 2개를 이용하면 해당 정보에 직접 접근이 가능합니다.

 

 

 

 

  • Conditional Completion 장점은 아래와 같습니다.

- Support for multiple versions of the same program in one source code

- Easy maintenance and debugging of code.

- Easy Migration of code to a different release of the database.

 

 

아래 그림처럼 5가지 경우에 대해서 알아보겠습니다.

 

 

 

간단한 샘플 코드 몇가지만 확인해 보겠습니다.

 

 

  • 오라클 서버의 버전을 확인하는 방법입니다
SELECT text 
from ALL_source
WHERE lower(name)='dbms_db_version'
order by line

/*
  version constant pls_integer :=
          19; -- RDBMS version number
  release constant pls_integer := 0;  -- RDBMS release number

  -- Deprecate boolean constants for unsupported releases 

  ver_le_9_1    constant boolean := FALSE;
  PRAGMA DEPRECATE(ver_le_9_1);
  ver_le_9_2    constant boolean := FALSE;
  PRAGMA DEPRECATE(ver_le_9_2);
  ver_le_9      constant boolean := FALSE;
  PRAGMA DEPRECATE(ver_le_9);
  ver_le_10_1   constant boolean := FALSE;
  PRAGMA DEPRECATE(ver_le_10_1);
  ver_le_10_2   constant boolean := FALSE;
  PRAGMA DEPRECATE(ver_le_10_2);
  ver_le_10     constant boolean := FALSE;
  PRAGMA DEPRECATE(ver_le_10);
  ver_le_11_1   constant boolean := FALSE;
  PRAGMA DEPRECATE(ver_le_11_1);
  ver_le_11_2   constant boolean := FALSE;
  ver_le_11     constant boolean := FALSE;
  ver_le_12_1   constant boolean := FALSE;
  ver_le_12_2   constant boolean := FALSE;
  ver_le_12     constant boolean := FALSE;
  ver_le_18     constant boolean := FALSE;
  ver_le_19     constant boolean := TRUE;
*/

 

 

 

begin
dbms_output.put_line(dbms_db_version.version);
dbms_output.put_line(dbms_db_version.release);
  if   dbms_db_version.ver_le_19 then
  dbms_output.put_line('it is 19c :)');
  end if;
  
end;
/*
19
0
it is 19c :)
*/

 

 

 

  • 버전별로 컴파일 하는 방법 - $if ~ $end
-- 오라클 11버전 이후부터 result_cache 옵션을 활성화

create or replace function get_sal
(p_emp_id number)
return number  $if dbms_db_version.version>=11 $then result_cache $end
is
v_sal number;
begin 
  select salary into v_sal
  from employees
  where employee_id=p_emp_id;
  
  return v_sal;
  
end;
/*Function GET_SAL compiled*/

 

 

 

  • $$ 2개를 이용하여 정보에 직접 접근하는 방법
SELECT name, value
FROM v$parameter
WHERE name ='plsql_optimize_level' ;
/*
NAME                           VALUE     
------------------------------ ----------
plsql_optimize_level           2   
*/


begin
    dbms_output.put_line($$plsql_Code_type);
    dbms_output.put_line($$plsql_optimize_level);
    dbms_output.put_line($$plsql_warnings);
end;
/*
INTERPRETED
2
DISABLE:ALL
*/

 

 

 

  • $ error 사용하는 방법
create or replace procedure g_test
is
begin 
    dbms_output.put_line('test');
end;


-- plsql_optimize_level이 2 이므로 오류발생
create or replace procedure g_test
is
begin 
    $if $$plsql_optimize_level <>3 $then
        $error 'it should be compiled with plsql_optimize_level=3 '  $end
    $end
    dbms_output.put_line('test');
end;
/*
LINE/COL  ERROR
--------- -------------------------------------------------------------
5/9       PLS-00179: $ERROR: it should be compiled with plsql_optimize_level=3 
Errors: check compiler log
*/


alter session set plsql_optimize_level=3;


create or replace procedure g_test
is
begin 
    $if $$plsql_optimize_level <>3 $then
        $error 'it should be compiled with plsql_optimize_level=3 '  $end
    $end
    dbms_output.put_line('test');
end;
/*
Procedure G_TEST compiled
*/