Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Динамическое создание триггера или как объяснить, что :new - это не связанная переменная  [new]
shandar
Member

Откуда:
Сообщений: 20
Доброго дня!

Сломал голову и гугл в поисках решения.
В общем задача следующая: нужно создать триггер на таблицу динамически (я, например, создаю через jdbc, но это не важно, можно и через EXECUTE IMMEDIATE).
В теле триггера используются ссылки на новую и старую строки - :new и :old. Понятно, что оракул (или драйвер jdbc) считает, что это связанные переменные и настойчиво просит биндить туда значения.
Скажите, как указать, что это - не связанные переменные (экранировать или еще как нибудь?).

Между прочим, именно эта проблема проявляется у OEM, когда пытаешься через него создать или подправить триггер!

Заранее спасибо
14 дек 11, 17:26    [11766215]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание триггера или как объяснить, что :new - это не связанная переменная  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
exec execute immediate 'create trigger tmp_tr before insert on tmp for each row begin :new.n:=1; end;';

PL/SQL procedure successfully completed.

Проблема на клиенте. С execute immediate проблемы быть не должно, ведь в execute immediate передаётся строка, а не запрос.
14 дек 11, 17:42    [11766362]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание триггера или как объяснить, что :new - это не связанная переменная  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
shandar
Доброго дня!

Сломал голову и гугл в поисках решения.
В общем задача следующая: нужно создать триггер на таблицу динамически (я, например, создаю через jdbc, но это не важно, можно и через EXECUTE IMMEDIATE).
В теле триггера используются ссылки на новую и старую строки - :new и :old. Понятно, что оракул (или драйвер jdbc) считает, что это связанные переменные и настойчиво просит биндить туда значения.
Скажите, как указать, что это - не связанные переменные (экранировать или еще как нибудь?).

Между прочим, именно эта проблема проявляется у OEM, когда пытаешься через него создать или подправить триггер!

Заранее спасибо

драйвер ваш можете выбросить в пропасть.
ну а пока не выбросили - разве что финтить на тему chr
execute immediate replace('create .. ляляля ~new.ляля := ..','~',chr(58);
14 дек 11, 18:02    [11766545]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание триггера или как объяснить, что :new - это не связанная переменная  [new]
shandar
Member

Откуда:
Сообщений: 20
ЧООРТ!!! да, признаю, на execute immediate я зря грешил.

mcureenab
С execute immediate проблемы быть не должно, ведь в execute immediate передаётся строка, а не запрос.


А кто мешает в строке использовать связанные переменные:

begin
  execute immediate 'begin dbms_output.put_line(:1); end;' using 'бу-га-га';
end;


Видимо, эта команда умеет распознавать двоеточие... а мой топик, походу, для спецов по JDBC, а не просто по Oracle.
14 дек 11, 18:05    [11766571]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание триггера или как объяснить, что :new - это не связанная переменная  [new]
shandar
Member

Откуда:
Сообщений: 20
orawish
драйвер ваш можете выбросить в пропасть.

Разбросались... но идея понятна, спасибо
14 дек 11, 18:08    [11766599]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание триггера или как объяснить, что :new - это не связанная переменная  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
shandar
А кто мешает в строке использовать связанные переменные:

begin
  execute immediate 'begin dbms_output.put_line(:1); end;' using 'бу-га-га';
end;




:1 это переменная призязки для оператора execute immediate, а не для begin. Для begin это просто кусок строки, который должен передаваться на сервер литерально.
14 дек 11, 18:09    [11766616]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить