powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
25 сообщений из 32, страница 1 из 2
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932381
Jarz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Из стороннего (third party) приложения работаю с базой Firebird 3. Проблема следующая.

Если я выполняю запрос "INSERT ...", делаю commit, то новые данные становятся доступными сразу (например, в IBExpert'е).
Если же я выполняю запрос "EXECUTE PROCEDURE ...", которая делает то же самое, то новые данные становятся доступными только после отключения от базы в приложении.

P.S. Проверил в IBExpert'е с помощью ODBCViewer

Если выполнить "EXECUTE PROCEDURE ...", затем "INSERT" или "UPDATE" куда-нибудь (с коммитами), то данные обновляются.

Можно ли, какие и где параметры драйвера подкрутить, чтобы запрос "EXECUTE PROCEDURE ..." сразу нормально коммитился? Или другой способ, если драйвер не виноват.
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932404
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.ibase.ru/transactions/
"Обязательное чтение."
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932422
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jarz,

либо это есть в настройках драйвера (autocommit), либо облом без явного завершения транзакций.
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932431
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jarz
Если я выполняю запрос "INSERT ...", делаю commit, то новые данные становятся доступными сразу (например, в IBExpert'е).
Если же я выполняю запрос "EXECUTE PROCEDURE ...", которая делает то же самое, то новые данные становятся доступными только после отключения от базы в приложении.

То есть, ты делаешь COMMIT после EXECUTE PROCEDURE - и "не работает"?

Враньё. Или ты не ту транзакцию коммитишь.
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932438
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёёИли ты не ту транзакцию коммитишь.

У ODBC всего одна транзакция, промахнуться невозможно. Вопрос в том "а коммитит ли он её"?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932557
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
ёёёёёИли ты не ту транзакцию коммитишь.

У ODBC всего одна транзакция, промахнуться невозможно. Вопрос в том "а коммитит ли он её"?
Ну так он написал "то же самое" - врёт?
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932558
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёёврёт?

"Добросовестно заблуждается."
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932579
Jarz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот что я делаю. Подключаюсь к БД IBExpert'ом и third party приложением (TP)

1.
a) В TP приложении выполняю (команды условные)
Код: sql
1.
2.
object.exec( "INSERT ..." );
object.commit();


b) в IBExpert'e обновляю таблицу (зелёная галочка Commit Transaction) - получаю только что записанные данные

с) В TP приложении выполняю
Код: sql
1.
2.
object.exec( "EXECUTE PROCEDURE ..." );
object.commit();


d) в IBExpert'e обновляю таблицу - не получаю только что записанные данные

2. В IBExpert'e
a) через ODBC Viewer выполняю INSERT
b) обновляю таблицу - получаю только что записанные данные
c) через ODBC Viewer выполняю EXECUTE PROCEDURE
d) обновляю таблицу - не получаю только что записанные данные
e) выполняю INSERT или UPDATE (даже в другую таблицу)
f) обновляю таблицу - получаю данные, записанные через EXECUTE PROCEDURE

В IBExpert'e вы и сами (при желании) можете проверить, чтобы убедиться.
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932581
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jarz,


какой конкретно ODBC драйвер используется?
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932586
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JarzВ IBExpert'e вы и сами (при желании) можете проверить, чтобы убедиться.
Вот только желания нет. Включай аудит в Firebird и смотри какие запросы и в каких
транзакциях выполняются.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932599
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jarz
c) через ODBC Viewer выполняю EXECUTE PROCEDURE
d) обновляю таблицу - не получаю только что записанные данные
А был ли мальчик ? Кто сказал, что EXECUTE PROCEDURE что-то куда-то записало ?
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932851
Jarz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ёёёёё
Jarz,
какой конкретно ODBC драйвер используется?

h__ps://firebirdsql.org/en/odbc-driver/
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932907
Jarz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
Включай аудит в Firebird и смотри какие запросы и в каких
транзакциях выполняются.

Включил. Посмотрел.
- Если сделать INSERT/UPDATE, то транзакция коммитится сразу
- Если сделать EXECUTE PROCEDURE, то транзакция не коммитится
- При следующем UPDATE/INSERT транзакция коммитится
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932921
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jarz,

Возможно в object.commit() проверяется какой-нибудь флаг, который не выставляется должным образом в object.exec( "EXECUTE PROCEDURE ..." );
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932938
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F,

я сходу не нашел, какие операции завершаются коммитом при автокоммите. То ли это общее для ОДБЦ, то-ли driver-specific.
Обычно в драйверах приавтокоммите однозначно завершаются коммитом insert, update и delete. Select - нет.
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932955
Jarz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vlad F
Jarz,
Возможно в object.commit() проверяется какой-нибудь флаг, который не выставляется должным образом в object.exec( "EXECUTE PROCEDURE ..." );

В IBExpert'овском ODBCViewer'е такое же поведение.


kdv
Vlad F,
я сходу не нашел, какие операции завершаются коммитом при автокоммите. То ли это общее для ОДБЦ, то-ли driver-specific.
Обычно в драйверах приавтокоммите однозначно завершаются коммитом insert, update и delete. Select - нет.

SELECT'ов в вызываемой процедуре нет, suspend-ов - тоже.
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932961
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если что, у нас работает. Никогда проблем не наблюдали. Jarz, по-вашему получается, что хранимку с клиента вообще никак не запустить?
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932964
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

"по его" получается, что после execute procedure нет коммита при автокоммите. Только и всего. Надо явно вызывать коммит.
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932965
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

ну как же, вот здесь 22089856 явно он написан. object.commit() - это не явный коммит?
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39932966
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv"по его" получается, что после execute procedure нет коммита при автокоммите. Только и
всего. Надо явно вызывать коммит.

Вот только он же утверждал, что явно вызывает коммит. Врал, наверное.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39933041
Jarz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне кажется, дело всё-таки в драйвере. В документации написано:
авторIf the BLR code for the stored procedure contains if (countSUSPEND == 1)...
Then the ODBC driver will use execute procedure .
...
If the BLR code for the stored procedure contains if (countSUSPEND > 1) as would be the case in this stored procedure definition:
Then the ODBC Driver will use select * from
Я порылся в исходниках: действительно, именно так и происходит. Определяется это в функции
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
bool IscProceduresResultSet::canSelectFromProcedure()
{
...
	metaData->connection->GDS->_print_blr((char*)buffer,(void (*)())gen_blr, &countSUSPEND,0);
...
	return countSUSPEND > 1;
}

class CFbDll
{
...
	print_blr*					_print_blr;
}; 


Только вот в исходниках Firebird у функции print_blr всего 3 параметра. А наиболее близкой является функция isc_print_blr . Возможно, из-за этого драйвер всегда подставляет "select *" . Подтвердить я это пока не могу, т.к. в трейс-логе отображается исходный текст запроса. Т.е. если я написал "ExEcuTe", то так в логе и будет. А итоговый я не знаю как посмотреть.

Видимо, следующий этап - попытаться собрать модифицированный драйвер самому.
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39933050
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JarzА итоговый я не знаю как посмотреть.

Повторяю медленно: включить аудит на стороне Firebird. Что ты якобы и сделал в
https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1322814&msg=22090471
Тоже врал?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39933064
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JarzВ документации написано:

Это - для ODBC-шного синтаксиса "{?call ...}". А ты, если не врал, использовал прямой
вызов EXECUTE PROCEDURE.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39933081
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jarz,

вообще это какая-то лабуда и самодеятельность. Есть в процедуре suspend, или нет, ничто не запрещает выполнить execute procedure и получить результат. Один, как положено.
Если же где-то внутри кто-то перекручивает вызов процедуры то так то эдак, по каким-то мутным критериям, то это его проблемы.
Если процедура селективная, и надо выбрать оттуда набор записей, так и вызывать её надо как select from procedure, а не как execute procedure.
...
Рейтинг: 0 / 0
ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
    #39933084
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jarz,

и еще добавлю, что если кто-то в селективной процедуре пишет insert/update/delete, то это тоже его проблемы :-)
И, явный коммит в драйвере должен работать, выполнялось вообще что-нибудь или нет.
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / ODBC, "execute procedure", commit - не обновляются данные до дисконнекта
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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