버전이 다른 오라클 서버들에 모두 적용가능한 하나의 코드를 만들어야 할 경우가 있습니다.
특정옵션들은 하위버전에서 동작하지 않게 때문에 컴파일 옵션을 다르게 적용할 필요가 있습니다.
아래 그림처럼 특정옵션은 버전마다 지원 여부가 다릅니다.
$ 기호를 이용해서 조건문을 만들수 있고 $$ 기호 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
*/
'Database > PLSQL' 카테고리의 다른 글
103 - [Oracle PL/SQL] Managing Code - plsql_ccflags 예시 (0) | 2024.05.15 |
---|---|
102 - [Oracle PL/SQL] Managing Code - plsql_ccflags (0) | 2024.05.14 |
100 - [Oracle PL/SQL] Compiler - package dbms_warning (0) | 2024.05.12 |
099 - [Oracle PL/SQL] Compiler - Warnings (0) | 2024.05.12 |
098 - [Oracle PL/SQL] Compiler - plsql_optimize_level (0) | 2024.05.12 |