Как сделать условную компиляцию только для одной заданной БД?
Есть БД для разработки, в которой есть некоторые пакеты, которые в конечном итоге копируются на производственную БД.
Ищу способ, используя условную компиляцию в спецификации пакета, которая включит компиляцию заданных функций только для этой одной БД разработки, но они будут исключены из компиляции на всех остальных БД.
Нет прав добавить что-то в производственной БД - никаких новых глобальных переменных/настроек и т.п.
Есть ли возможность сделать что-то подобное:
$IF {{development_server}} $THEN
my_proc;
$END
Свободный перевод вопроса PL/SQL - conditional compilation specific to one database от участника @Major Major
Ответы (1 шт):
Установите только на БД для разработки свой специфический флаг компиляции:
PLSQL_CCFLAGS='flagName:<true|false>'
В продуктивной БД он будет не определён, что по умолчанию всегда - FALSE.
create or replace package pkg1 is
init int := 0;
procedure prodproc (par varchar2);
$if $$ccflag_devl $then
procedure devlproc (par varchar2);
$end
end;
/
create or replace package body pkg1 is
procedure prodproc (par varchar2) is
begin
dbms_output.put_line ('Production '||par||' code executed.');
end;
$if $$ccflag_devl $then
procedure devlproc (par varchar2) is
begin
dbms_output.put_line ('Development '||par||' code executed.');
end;
$end
begin
$if $$ccflag_devl $then
prodproc ('init');
devlproc ('init');
$else
prodproc ('init');
$end
end;
/
exec pkg1.devlproc ('some')
Error report -
ORA-06550: line 1, column 12:
PLS-00302: component 'DEVLPROC' must be declared
Ошибка как и ожидалось, флаг еще не установлен. Установите его и скомпилируйте пакет:
alter session set plsql_ccflags='ccflag_devl:true';
alter package pkg1 compile;
exec pkg1.devlproc
Production init code executed.
Development init code executed.
Development some code executed.