powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Загадочная ошибка 746...
6 сообщений из 6, страница 1 из 1
Загадочная ошибка 746...
    #34356332
Vladimir Dyuzhev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть такая процедурка, рожденная в битве за интеграцию с одним legacy app:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE PROCEDURE DB2IBBP.GET_NEXT_PK(IN NAME VARCHAR( 35 ),OUT PK INTEGER)
    LANGUAGE SQL
    MODIFIES SQL DATA
    NOT DETERMINISTIC
    NO EXTERNAL ACTION
    BEGIN ATOMIC
        SELECT MAX_PRIMARY_KEY INTO PK FROM DB2IBBP.PRIM_KEY_RANGE WHERE LCASE(TABLE_NAME)=LCASE(NAME);
        UPDATE DB2IBBP.PRIM_KEY_RANGE SET MAX_PRIMARY_KEY = MAX_PRIMARY_KEY +  1  WHERE LCASE(TABLE_NAME)=LCASE(NAME);
    END

(Вообще-то, хочется внутри заиметь WITH -- чтобы update и select в одном statement были, но пока есть проблема поважнее.)

Как, наверное, видно, процедура получает следующий свободный PK для заданной таблицы NAME.

Далее процедуру используем в триггере INSTEAD OF INSERT как:

Код: plaintext
1.
2.
3.
4.
5.
6.
DECLARE PK INTEGER;
CALL DB2IBBP.GET_NEXT_PK('txn_cash_cr',PK);
INSERT INTO ... (KEY,...) VALUES (PK, ...);
CALL DB2IBBP.GET_NEXT_PK('txn_cash_dr',PK);
INSERT INTO ... (KEY,...) VALUES (PK, ...);
...

Так вот, на втором CALL получаем прелюбопытнейшую ошибку 746 --

com.ibm.db2.jcc.b.SqlException: DB2 SQL error: SQLCODE: -723, SQLSTATE: 09000, SQLERRMC: DB2IBBP.T_ADD_TM;-746;57053;DB2IBBP.GET_NEXT_PK|SQL070226162912400|REA

которая означает, что мы читаем таблицу, которую уже изменили(???). Изменить-то изменили (ту самую PRIM_KEY_RANGE), да изменили-то другую запись!

Я не понимаю, почему это происходит. Кто-нибудь может пояснить?
...
Рейтинг: 0 / 0
Загадочная ошибка 746...
    #34356716
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Заверните
Код: plaintext
1.
2.
3.
4.
5.
DECLARE PK INTEGER;
CALL DB2IBBP.GET_NEXT_PK('txn_cash_cr',PK);
INSERT INTO ... (KEY,...) VALUES (PK, ...);
CALL DB2IBBP.GET_NEXT_PK('txn_cash_dr',PK);
INSERT INTO ... (KEY,...) VALUES (PK, ...);
...
в процедуру и вызывайте ее внутри триггера.
...
Рейтинг: 0 / 0
Загадочная ошибка 746...
    #34358669
Vladimir Dyuzhev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark BarinsteinЗаверните ... в процедуру и вызывайте ее внутри триггера.

Пока ждал ответа, сделал немного не так, но по сути, видимо, так же:

Код: plaintext
1.
CALL DB2IBBP.GET_NEXT_PK('third_party','tmpl_reg','tmpl_txn_cash_dr','tmpl_txn_cash_cr','tmpl_txn_hist',PK1,PK2,PK3,PK4,PK5);        

То есть вместо пяти вызовов процедуры идет один.

Но я таки не понимаю, из-за чего проблема -- а именно это мне и хочется понять. Что такого неправильного я делаю, если вызываю процедуру несколько раз? Или я вообще чего-то более фундаментального не понимаю (делаем скиду -- я жаба-девелопер, не DBA)?
...
Рейтинг: 0 / 0
Загадочная ошибка 746...
    #34359484
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vladimir DyuzhevНо я таки не понимаю, из-за чего проблема -- а именно это мне и хочется понять. Что такого неправильного я делаю, если вызываю процедуру несколько раз? Или я вообще чего-то более фундаментального не понимаю (делаем скиду -- я жаба-девелопер, не DBA)?Похоже, что это глюк, хотя я могу и ошибаться.
Такая ошибка описана здесь .
Но, по-моему, к данному случаю она не относится, т.е. не должна появляться.
Странно, что если вложить 2 call в другую процедуру, а не вызавать их напрямую в dynamic compound statement (именно так оно вызывается в триггере), то ошибки нет.
...
Рейтинг: 0 / 0
Загадочная ошибка 746...
    #34361779
Vladimir Dyuzhev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein
Похоже, что это глюк, хотя я могу и ошибаться.
Такая ошибка описана здесь .


О, спасибо за ссылку! Как раз она всё объясняет: есть триггер с top-level контекстом, есть два вызова одной и той же процедуры, каждая со своим контекстом ; когда первая процедура модифицирует таблицу, контекст второй процедуры теряет к ней доступ, ибо у теблицы "неопределенное состояние". Не очень, конечно, удобно, но -- такой монастырь. Будем знать. Спасибо!
...
Рейтинг: 0 / 0
Загадочная ошибка 746...
    #34362669
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На практике получается так, что у них эти 2 call работают из внешней atomic процедуры, которая может быть даже вызвана из dynamic compound statement'а, но не работают, если вызываются из dynamic compound statement'а напрямую:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create table confl_mx (name varchar( 35 ), pk int)@

CREATE PROCEDURE CONFL_GET_PK(IN NAME VARCHAR( 35 ), OUT PK INTEGER)
LANGUAGE SQL
MODIFIES SQL DATA
BEGIN
 SELECT old_pk into pk
 FROM FINAL TABLE
 (
 UPDATE confl_mx INCLUDE (old_pk int)
 SET old_pk = pk, pk = pk +  1 
 WHERE name = CONFL_GET_PK.NAME
 ) T;
END@
так вот:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE PROCEDURE CONFL_GET
LANGUAGE SQL
BEGIN ATOMIC
  DECLARE PK INT;
  CALL CONFL_GET_PK('NAME1', PK);
  CALL CONFL_GET_PK('NAME2', PK);
END@

BEGIN ATOMIC
 CALL CONFL_GET;
END@
работает, а
Код: plaintext
1.
2.
3.
4.
BEGIN ATOMIC
  DECLARE PK INT;
  CALL CONFL_GET_PK('NAME1', PK);
  CALL CONFL_GET_PK('NAME2', PK);
END@
не работает.
В чем разница - не понятно.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Загадочная ошибка 746...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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