powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / EXECUTE STATEMENT и NEW
6 сообщений из 6, страница 1 из 1
EXECUTE STATEMENT и NEW
    #32527317
mclow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использую FB1.5 (buid 4290) очень доволен, особенно появившимся execute statement ;)
Но вот такое в триггере не получается :(

-- Получаем список полей
for select rdb$relation_fields.rdb$field_name as field_name,
rdb$fields.rdb$field_type as field_type,
rdb$fields.rdb$field_length as field_length
from rdb$relation_fields
inner join rdb$fields
on rdb$fields.rdb$field_name=rdb$relation_fields.rdb$field_source
where rdb$relation_fields.rdb$relation_name='TB_PERSON'
and rdb$relation_fields.rdb$field_name <> 'UID'
order by 1
into :tmp_fieldname,:tmp_fieldtype,:tmp_fieldlen
do
begin
....
-- Собираем строку для выполнения
csql = 'insert into HT_PERSON (UID,S_FIELDNAME,N_ACTION) VALUES ('
|| cast (NEW.uid as varchar(20)) || ','
|| cast (OLD.' || :tmp_fieldname ||' as varchar(255))
|| ',1);';
execute statement csql;
....
end
помогите, пожалуйста.
...
Рейтинг: 0 / 0
EXECUTE STATEMENT и NEW
    #32527364
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Информации - ноль. Какой тип триггера, что именно не получается, как ругается сервер и т.п. Это все клещами вытягивать, что-ли? Вдобавок, вот это вот:

автор|| cast (OLD.' || :tmp_fieldname ||' as varchar(255))

есть фигня какая-то.
...
Рейтинг: 0 / 0
EXECUTE STATEMENT и NEW
    #32527378
mclow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри...Тип триггера BEFORE INSERT OR UPDATE
очень хочется универсальный механизм, позволяющий не перебирать все поля таблицы с целью получить старые значения изменившихся столбцов и записать их для истории.

ошибку вызывает попытка использовать NEW или OLD в выражении EXECUTE STATEMENT.
Возможно, что это нагромождение можно заменить, но не знаю как :(
...
Рейтинг: 0 / 0
EXECUTE STATEMENT и NEW
    #32527529
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EXECUTE STATEMENT принимает на вход DSQL-строку. В ней не может быть ссылок на переменные, включая OLD/NEW-контексты.

Вот так будет работать:

Код: plaintext
EXECUTE STATEMENT 'INSERT INTO T1 VALUES (' || CAST(NEW.ID AS VARCHAR( 20 ) || ')'

но вот так:

Код: plaintext
EXECUTE STATEMENT 'INSERT INTO T1 VALUES (NEW.ID)'

не будет.

Далее, в триггере BEFORE INSERT OR UPDATE надо аккуратно работать с OLD-контекстом. При вставке все OLD-поля будут равны NULL.
...
Рейтинг: 0 / 0
EXECUTE STATEMENT и NEW
    #32527606
mclow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но в данном случае придется все поля таблицы перечислять! :(
А можно ли использовать имена столбцов полученные из запроса?
PS: может я много хочу от FB? ;)
...
Рейтинг: 0 / 0
EXECUTE STATEMENT и NEW
    #32528151
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНо в данном случае придется все поля таблицы перечислять! :(

Разумеется. А в чем проблема?

авторА можно ли использовать имена столбцов полученные из запроса?

Где? Если в EXECUTE STATEMENT - почему нет? Там же просто строка на вход идет. Которую ты сам формируешь любым способом, включая выборку из метаданных, например.

авторPS: может я много хочу от FB? ;)

Угу. И заодно чем-то не тем занимаешься ;-)
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / EXECUTE STATEMENT и NEW
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]