Да, это так.Вот пример, где первая хранимая процедура хочет выбрать из XALL_TABLES, но если этой таблицы не существует, выберите из двойной.Наконец, поскольку у меня нет объекта XALL_TABLES, первая хранимая процедура выбирает из двойного.Второй, делает то же самое с объектом ALL_TABLES.Поскольку ALL_TABLES существует, вторая хранимая процедура выбирает из all_tables, но не из DUAL.
Этот тип конструкции полезен, когда пакет должен быть развернут во всей вашей базе данных и использовать таблицы, которые развернуты не везде .... (хорошо, возможно, есть концептуальная проблема, но это происходит).
--conditionals compilation instructions accept only static condition (just with constants)
--passing sql bind variable doesn't work
--To pass a value to a conditional compilation instruction, I bypasses the use of input parameters of the script
--these 4 next lines affect a value to the first and the second input parameter of the script
--If your originally script use input script parameter, use the next free parameter ...
column param_1 new_value 1 noprint
select nvl(max(1), 0) param_1 from all_views where owner = 'SYS' and view_name = 'XALL_TABLES';
column param_2 new_value 2 noprint
select nvl(max(1), 0) param_2 from all_views where owner = 'SYS' and view_name = 'ALL_TABLES';
CREATE or replace PACKAGE my_pkg AS
function test_xall_tables return varchar2;
function test_all_tables return varchar2;
END my_pkg;
/
CREATE or replace PACKAGE BODY my_pkg AS
function test_xall_tables return varchar2 is
vch varchar2(50);
begin
$IF (&1 = 0) $THEN
select 'VIEW XALL_TABLES D''ONT EXISTS' into vch from dual;
$ELSE
select max('VIEW XALL_TABLES EXISTS') into vch from XALL_TABLES;
$END
return vch;
end test_xall_tables;
function test_all_tables return varchar2 is
vch varchar2(50);
begin
$IF (&2 = 0) $THEN
select 'VIEW ALL_TABLES D''ONT EXISTS' into vch from dual;
$ELSE
select max('VIEW ALL_TABLES EXISTS') into vch from ALL_TABLES;
$END
return vch;
end test_all_tables;
END my_pkg;
/
тест:
select my_pkg.test_xall_tables from dual;
дают
ПОСМОТРЕТЬ XALL_TABLES D'ONT EXISTS
select my_pkg.test_all_tables from dual;
дай
ПОСМОТРЕТЬ ВСЕ_ ТАБЛИЦЫ СУЩЕСТВУЕТ