powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / Че-то все не как в faq-е получается
9 сообщений из 9, страница 1 из 1
Че-то все не как в faq-е получается
    #34705325
falcon111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Просветите плиз, что я не так понимаю в DBINFO('sqlca.sqlerrd1'); Сколько лет использовал эту функцию - ни разу проблем не было.
По описанию - возвращает последний вставленный в таблицу сериал. Если вставка была в триггере - значит вернет ее.

У меня та 10.tc5 так не получается:
Есть таблица. На ее апдейт есть триггер, который добавляет записи во вторую таблицу-лог.
Делаю апдейт на первую таблицу. Апдейт проходит, триггер со вставкой - тоже. Но dbinfo в результате возвращает 0

Почему?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
create table tmp_t1(s1 serial, t1 varchar( 16 ));
create table tmp_t2(s2 integer, t2 varchar( 16 ));

insert into tmp_t1(t1) values('test1');
insert into tmp_t1(t1) values('test2');
insert into tmp_t1(t1) values('test3');

create trigger tmp_trig_insert update on tmp_t1
  referencing new as n
  for each row
  (insert into tmp_t2(s2, t2) values(n.s1, n.t1));

create procedure tmp_test_dbinfo() returning integer;
  define t_id integer;

  update tmp_t1 set t1='mega-'||t1 where s1= 2 ;
  let t_id=DBINFO('sqlca.sqlerrd1');

  return t_id;
end procedure;

execute procedure tmp_test_dbinfo();

select * from tmp_t2;
select * from tmp_t1;

drop trigger tmp_trig_insert;

drop procedure tmp_test_dbinfo;

drop table tmp_t2;
drop table tmp_t1;

Результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Table successfully created.
Table successfully created.
 1  rows were inserted.
 1  rows were inserted.
 1  rows were inserted.
Trigger successfully created.
Procedure successfully created.
E1_EXPR    
-----------
 0           
 1  rows selected.
s2          t2              
----------------------------
 2            mega-test2      
 1  rows selected.
s1          t1              
----------------------------
 1            test1           
 2            mega-test2      
 3            test3           
 3  rows selected.


E1_EXPR
-----------
0


Почему процедура возвращает 0 ??
...
Рейтинг: 0 / 0
Че-то все не как в faq-е получается
    #34705326
falcon111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В примере ошибочка вышла. :( Правильный пример - такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
create table tmp_t1(s1 serial, t1 varchar( 16 ));
create table tmp_t2(ns serial, s2 integer, t2 varchar( 16 ));

insert into tmp_t1(t1) values('test1');
insert into tmp_t1(t1) values('test2');
insert into tmp_t1(t1) values('test3');

create trigger tmp_trig_insert update on tmp_t1
  referencing new as n
  for each row
  (insert into tmp_t2(s2, t2) values(n.s1, n.t1));

create procedure tmp_test_dbinfo() returning integer;
  define t_id integer;

  update tmp_t1 set t1='mega-'||t1 where s1= 2 ;
  let t_id=DBINFO('sqlca.sqlerrd1');

  return t_id;
end procedure;

execute procedure tmp_test_dbinfo();

select * from tmp_t2;
select * from tmp_t1;

drop trigger tmp_trig_insert;

drop procedure tmp_test_dbinfo;

drop table tmp_t2;
drop table tmp_t1;
...
Рейтинг: 0 / 0
Че-то все не как в faq-е получается
    #34706884
Фотография TmpFile()
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функция DBINFO...Что бы обеспечить доставерность результата, эту опцию следует использовать сразу после одноименного оператора INSERT, который вставляет в таблицу одну строку, содержащую знчение типа SERIAL...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create procedure tmp_test_dbinfo1(_s1 integer, _t1 varchar( 20 )) returning integer;
  define t_id integer;

  insert into tmp_t2(s2, t2) values(_s1, _t1));
  let t_id = DBINFO('sqlca.sqlerrd1');

  return t_id;
end procedure;
...
Рейтинг: 0 / 0
Че-то все не как в faq-е получается
    #34708280
falcon111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TmpFile() Функция DBINFO...Что бы обеспечить доставерность результата, эту опцию следует использовать сразу после одноименного оператора INSERT, который вставляет в таблицу одну строку, содержащую знчение типа SERIAL...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create procedure tmp_test_dbinfo1(_s1 integer, _t1 varchar( 20 )) returning integer;
  define t_id integer;

  insert into tmp_t2(s2, t2) values(_s1, _t1));
  let t_id = DBINFO('sqlca.sqlerrd1');

  return t_id;
end procedure;


Это все понятно, да, так оно работает. Однако меня это не устраивает - в триггере получать ИД бесполезно - триггер срабатывает при апдейте из разных мест кода. И только в одном месте мне нужно получить ИД вставленного serial-а.

Можно, конечно, переделать код, чтобы оно работало по-другому, но просто я хочу разобраться - это фича или бага, что при инсерте в триггере переменная sqlerrd1 не устанавливается, хотя в faq-е когда-то читал, что там хранится значение последнего вставленного serial-а, и если вставка делалась в трггере, то будет и этот сериал
...
Рейтинг: 0 / 0
Че-то все не как в faq-е получается
    #34709269
Фотография TmpFile()
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чем неподходит так?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
create procedure tmp_test_dbinfo() returning integer;
  define t_id integer;

  update tmp_t1 set t1='mega-'||t1 where s1= 2 ;

  let t_id = (select max(ns) from tmp_t2);

  return t_id;
end procedure;

Я привела цитату из докуметации к информиху.
Руководство по синтакису языка SQL. Использование опции 'sqlca.sqlerrd1'.

falcon111
хотя в faq-е когда-то читал, что там хранится значение последнего вставленного serial-а, и если вставка делалась в трггере, то будет и этот сериал.

и условие функция используется СРАЗУ после INSERT
...
Рейтинг: 0 / 0
Че-то все не как в faq-е получается
    #34714521
falcon111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TmpFile()Чем неподходит так?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create procedure tmp_test_dbinfo() returning integer;
  define t_id integer;

  update tmp_t1 set t1='mega-'||t1 where s1= 2 ;
  let t_id = (select max(ns) from tmp_t2);

  return t_id;
end procedure;

В данный момент оно так и сделано, но ведь это же неправильно и может давать неправильный результат при большом числе подключений и при "завернувшемся" сериале (когда часть строк убрана в архив, и сериал добавляется НЕ с бОльшими значениями)

TmpFile()Я привела цитату из докуметации к информиху.
Руководство по синтакису языка SQL. Использование опции 'sqlca.sqlerrd1'.
falcon111
хотя в faq-е когда-то читал, что там хранится значение последнего вставленного serial-а, и если вставка делалась в трггере, то будет и этот сериал.

и условие функция используется СРАЗУ после INSERT
Инсерт делается в триггере, поэтому ТАМ это бессмыссленно. А по ходу выполнения кода - я сразу и запрашиваю - сразу ПОСЛЕ выполнения операции, вызывающей сработку триггера.

Мне вот интересно - на 9-ке кто-нибудь может проверить работоспособность такого метода? А то что-то у меня ощущение, что это 10-ткины штучки.
...
Рейтинг: 0 / 0
Че-то все не как в faq-е получается
    #34714655
Фотография TmpFile()
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня дома 9-ка :), на работе 10-ка. Выполняется и там и там одинаково.
Цитата из доки по информиху от 9-ки. Задаётся мне Вы не читаете ни документацию, ни посты внимательно.
...
Рейтинг: 0 / 0
Че-то все не как в faq-е получается
    #34714828
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может в глобальную переменную сразу после инсерта положить?
...
Рейтинг: 0 / 0
Че-то все не как в faq-е получается
    #34715236
falcon111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TmpFile()У меня дома 9-ка :), на работе 10-ка. Выполняется и там и там одинаково.
Печально. Значит, так задумано. Буду переделывать чтобы работало по другому.

TmpFile()Цитата из доки по информиху от 9-ки. Задаётся мне Вы не читаете ни документацию, ни посты внимательно.[/quit]

:-) Ну не знаю. Вопрос потому и возник, что я про триггер в faq-е читал, в мозгу отложилось, вот и рассчитывал реализовать на практике, когда столкнулся.

[quot Журавлев Денис]Может в глобальную переменную сразу после инсерта положить?
Да. Сейчас, в качестве временного решения стоит затычка select max(..) , но, раз с sqlca у меня пролет, придется делать через глобальные переменные.

Всем спасибо.

ЗЫ: А вообще вопрос возник от того, что я точно помню что читал про sqlca и триггеры в Faq. А неправильный faq - это плохо (или это у меня проблемы с памятью...) ;(
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Informix [игнор отключен] [закрыт для гостей] / Че-то все не как в faq-е получается
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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