9 мая 2011 г.

Условная компиляция в SQL+

Оказывается с помощью хитрого трюка с переменными замены SQL*Plus (substitution variables) можно делать условную компиляцию не только на сервере - в движке PL/SQL, но и на клиенте:





--Включаем трассировку
define is_client_trace="--"

begin
&is_client_trace
dbms_output.put_line('Код включаемый для трассировки');
--*/

dbms_output.put_line('Оcновная логика ...');
end;

В чем разница по сравнению с PL/SQL Conditional Compilation ?
В данном случае код просто будет в виде комментария.


--Выключаем трассировку
define is_client_trace=/*
begin
&is_client_trace
dbms_output.put_line('"Этот код будет в виде комментария');
--*/

dbms_output.put_line('Оcновная логика ...');
end;



К сожалению, подобное можно сделать только в блоке PL/SQL, но не в потоке DDL-команд: SQL+ обрабатывает переменные замены только в составе какого-либо оператора. Если Вы знаете как это обойти, пожалуйста дайте мне знать об этом!
:-)

На фото - до боли знакомый графический SQL+, как его нам не хватает сегодня в 11g ...
:-)

4 комментария:

  1. Добрый день, Игорь,

    > В данном случае код вообще не передается на сервер !

    Код на сервер ведь передаётся в любом случае, просто в данном случае, он передаётся в виде коментария.

    ОтветитьУдалить
  2. Согласен с вами !
    Спасибо - я подправил текст .

    ОтветитьУдалить
  3. Не совсем понятно, что имелось ввиду под "К сожалению, подобное можно сделать только в блоке PL/SQL, но не в потоке DDL-команд: SQL+ обрабатывает переменные замены только в составе какого-либо оператора."
    Но вообще при "set define = on" или
    set esc=\
    set define=\&
    работает нормально с чем угодно. Вот пример: создаем файлик с содержимым:
    create table &tab1(&col1 number);
    create table &tab2(&col2 number);
    create table &tab3(&col3 number);
    Теперь выполняем его:
    DB11G/XTENDER> ed test_subst

    DB11G/XTENDER> @test_subst
    Enter value for tab1: a
    Enter value for col1: a
    old 1: create table &tab1(&col1 number)
    new 1: create table a(a number)

    Table created.

    Elapsed: 00:00:00.02
    Enter value for tab2: a
    Enter value for col2: a
    old 1: create table &tab2(&col2 number)
    new 1: create table a(a number)
    create table a(a number)
    *
    ERROR at line 1:
    ORA-00604: error occurred at recursive SQL level 1
    ORA-06502: PL/SQL: numeric or value error
    ORA-06512: at line 11
    ORA-00955: name is already used by an existing object


    Elapsed: 00:00:00.00
    Enter value for tab3: a
    Enter value for col3: a
    old 1: create table &tab3(&col3 number)
    new 1: create table a(a number)
    create table a(a number)
    *
    ERROR at line 1:
    ORA-00604: error occurred at recursive SQL level 1
    ORA-06502: PL/SQL: numeric or value error
    ORA-06512: at line 11
    ORA-00955: name is already used by an existing object


    Elapsed: 00:00:00.01

    ОтветитьУдалить
  4. Вы не поняли - я имел в виду именно условную компиляцию, а не препроцессинг символов подстановки.
    Хотелось бы нечто подобное:

    create table test
    ( id $if $$some_condition $then
    NUMBER
    $lse
    VARCHAR2(32)
    $end
    );

    Как это реализовать ?

    ОтветитьУдалить