![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вызов "произвольной" процедуры в триггере [D6, D7, IB6.x, FireBird]
tech © (2006-01-08 03:24:00)Работа с FireBird.
Возможно ли в триггере вызвать процедуру UDF, имя которой "вычисляется" в самом триггере на основании неких данных. Количество таких процедур неограничено и непредсказуемо, поэтому прописать их в триггере нельзя. "Вычисленное" имя процедуры точно будет объявлено в одной из присоединенных UDF.
tech (2006-01-08 20:16:00) [1]Спасибо, все получилось
Desdechado (2006-01-08 17:52:00) [2]тренируй наблюдательность, найди различия в моей строке кода и своей
tech (2006-01-08 16:42:00) [3]Извините,
конечно, ФУНКЦИЮ UDF, а не процедуру.
Спасибо за идею, но:
Решение через EXECUTE STATEMENT реализовать не удалось, поскольку непонятно, как в выполняемой СТРОКЕ указать переменную, куда следует поместить результат. Вот тестовый код триггера:
CREATE TRIGGER DMO_AD0 FOR DMO
ACTIVE AFTER DELETE POSITION 0
AS
declare variable fname varchar(20);
declare variable fres varchar(255);
declare variable fpar varchar(255);
begin
fname = 'upcase';
fpar = 'La-La-La';
execute statement 'SELECT '||fname||'('''||fpar||''')'||' FROM rdb$database INTO :fres';
end
Пытался по-всякому приписать к строке fres - переменную, куда следует поместить результат - не удается. Подскажите, как сделать?
Desdechado (2006-01-08 14:55:00) [4]если тебе нужно в триггере сделать
x=неизвестная_заранее_UDF();
то так не выйдет
а вот DML-операцию провернуть можно через EXECUTE, свормировав ее "на лету"
хотя можно и изврат с присвоением сделать через
EXECUTE STATEMENT 'SELECT ' || твоя_UDF || ' FROM rdb$database' INTO :x;
только типы надо четко контролировать
Fay (2006-01-08 05:05:00) [5]2 tech © (08.01.06 3:24)
> вызвать процедуру UDF
Поаккуратнее с терминами. Я, к примеру, не понял.
> "Вычисленное" имя процедуры
Если здесь "процедура" = UDF, то можно вызвать её по имени, передав его в заранее известную UDF. Иначе - смотри ниже.
В общем случае
ниже:
задача имеет решения только с EXECUTE.
Подробности в http://firebird.sourceforge.net/download/prerelease/rlsnotes153_05.zip