PL / SQL - условная компиляция, специфичная для одной базы данных - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть база данных разработки Oracle, в которой есть несколько пакетов, которые в итоге копируются на рабочие серверы. Я ищу способ использовать условную компиляцию в спецификации пакета, которая верна только на этом одном сервере разработки, но компилируется в ложь на всех других серверах.

Я не могу ничего добавить к производственным серверам для достижения этой цели - нет новой глобальной переменной / настроек конфигурации / процедур / и т. Д.

Так есть ли способ эффективно сделать

$IF {{development_server}} $THEN
    my_proc;
$END

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

v $ database содержит имя базы данных. Если они названы по-другому, это должно сработать.

SELECT NAME FROM v$database;
0 голосов
/ 27 апреля 2018

Я не уверен, что это именно то, что вам нужно, но это должно дать вам кое-что для работы:

CREATE OR REPLACE PACKAGE my_app_state
   AUTHID DEFINER
IS
   c_in_production   CONSTANT BOOLEAN := TRUE;
END;
/

CREATE OR REPLACE PROCEDURE test_app_state
   AUTHID DEFINER
IS
   PROCEDURE my_proc1 
   IS
   BEGIN
      DBMS_OUTPUT.PUT_LINE ('1');
   END;

   PROCEDURE my_proc2
   IS
   BEGIN
      DBMS_OUTPUT.PUT_LINE ('2');
   END;
BEGIN
   $if my_app_state.c_in_production $then
      my_proc1;
   $else
      my_proc2;
   $end
end;
/

EXEC test_app_state

Вы также можете использовать флаг условной компиляции. Если он не определен, он просто по умолчанию равен NULL, поэтому состояние дел по умолчанию «выключено».

CREATE OR REPLACE PROCEDURE test_app_state
   AUTHID DEFINER
IS
   PROCEDURE my_proc1 
   IS
   BEGIN
      DBMS_OUTPUT.PUT_LINE ('1');
   END;

   PROCEDURE my_proc2
   IS
   BEGIN
      DBMS_OUTPUT.PUT_LINE ('2');
   END;
BEGIN
   $if $$cc_in_dev $then
      my_proc1;
   $else
      my_proc2;
   $end
end;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...