|
|
|
EXECUTE STATEMENT и NEW
|
|||
|---|---|---|---|
|
#18+
Использую 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 помогите, пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2004, 07:58:45 |
|
||
|
EXECUTE STATEMENT и NEW
|
|||
|---|---|---|---|
|
#18+
Информации - ноль. Какой тип триггера, что именно не получается, как ругается сервер и т.п. Это все клещами вытягивать, что-ли? Вдобавок, вот это вот: автор|| cast (OLD.' || :tmp_fieldname ||' as varchar(255)) есть фигня какая-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2004, 08:58:49 |
|
||
|
EXECUTE STATEMENT и NEW
|
|||
|---|---|---|---|
|
#18+
Сорри...Тип триггера BEFORE INSERT OR UPDATE очень хочется универсальный механизм, позволяющий не перебирать все поля таблицы с целью получить старые значения изменившихся столбцов и записать их для истории. ошибку вызывает попытка использовать NEW или OLD в выражении EXECUTE STATEMENT. Возможно, что это нагромождение можно заменить, но не знаю как :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2004, 09:12:13 |
|
||
|
EXECUTE STATEMENT и NEW
|
|||
|---|---|---|---|
|
#18+
EXECUTE STATEMENT принимает на вход DSQL-строку. В ней не может быть ссылок на переменные, включая OLD/NEW-контексты. Вот так будет работать: Код: plaintext но вот так: Код: plaintext не будет. Далее, в триггере BEFORE INSERT OR UPDATE надо аккуратно работать с OLD-контекстом. При вставке все OLD-поля будут равны NULL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2004, 10:31:27 |
|
||
|
EXECUTE STATEMENT и NEW
|
|||
|---|---|---|---|
|
#18+
Но в данном случае придется все поля таблицы перечислять! :( А можно ли использовать имена столбцов полученные из запроса? PS: может я много хочу от FB? ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2004, 10:55:52 |
|
||
|
EXECUTE STATEMENT и NEW
|
|||
|---|---|---|---|
|
#18+
авторНо в данном случае придется все поля таблицы перечислять! :( Разумеется. А в чем проблема? авторА можно ли использовать имена столбцов полученные из запроса? Где? Если в EXECUTE STATEMENT - почему нет? Там же просто строка на вход идет. Которую ты сам формируешь любым способом, включая выборку из метаданных, например. авторPS: может я много хочу от FB? ;) Угу. И заодно чем-то не тем занимаешься ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2004, 14:02:09 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32527317&tid=1578604]: |
0ms |
get settings: |
5ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
168ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 202ms |
| total: | 445ms |

| 0 / 0 |
