Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Informix [игнор отключен] [закрыт для гостей] / Че-то все не как в faq-е получается / 9 сообщений из 9, страница 1 из 1
04.08.2007, 03:37
    #34705325
falcon111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Че-то все не как в faq-е получается
Просветите плиз, что я не так понимаю в 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
04.08.2007, 03:44
    #34705326
falcon111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Че-то все не как в faq-е получается
В примере ошибочка вышла. :( Правильный пример - такой:
Код: 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
06.08.2007, 10:07
    #34706884
TmpFile()
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Че-то все не как в faq-е получается
Функция 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
06.08.2007, 16:05
    #34708280
falcon111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Че-то все не как в faq-е получается
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
07.08.2007, 06:43
    #34709269
TmpFile()
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Че-то все не как в faq-е получается
Чем неподходит так?

Код: 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
08.08.2007, 16:29
    #34714521
falcon111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Че-то все не как в faq-е получается
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
08.08.2007, 16:58
    #34714655
TmpFile()
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Че-то все не как в faq-е получается
У меня дома 9-ка :), на работе 10-ка. Выполняется и там и там одинаково.
Цитата из доки по информиху от 9-ки. Задаётся мне Вы не читаете ни документацию, ни посты внимательно.
...
Рейтинг: 0 / 0
08.08.2007, 17:37
    #34714828
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Че-то все не как в faq-е получается
Может в глобальную переменную сразу после инсерта положить?
...
Рейтинг: 0 / 0
08.08.2007, 19:41
    #34715236
falcon111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Че-то все не как в faq-е получается
TmpFile()У меня дома 9-ка :), на работе 10-ка. Выполняется и там и там одинаково.
Печально. Значит, так задумано. Буду переделывать чтобы работало по другому.

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

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

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

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

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


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