Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
 Переход FB2.5 -> FB4: INSERT INTO RETURNING ID  [new]
pasergey
Member

Откуда:
Сообщений: 20
Добрый день!

Решили перейти с FB2.5на FB4.

Столкнулись с ошибкой "Cursor is not open" при выполнении такой конструкции на клиенте
INSERT INTO
RETURNING ID

Как решить эту проблему?
13 окт 21, 10:48    [22383007]     Ответить | Цитировать Сообщить модератору
 Re: Переход FB2.5 -> FB4: INSERT INTO RETURNING ID  [new]
hvlad
Member

Откуда:
Сообщений: 11555
pasergey,

правильно выполнять запрос, он теперь возвращает курсор.
Как вы его выполняете ?
13 окт 21, 10:51    [22383010]     Ответить | Цитировать Сообщить модератору
 Re: Переход FB2.5 -> FB4: INSERT INTO RETURNING ID  [new]
p_s_v
Member

Откуда:
Сообщений: 7
Добрый день!

Запрос вида:

INSERT INTO C_TMP (id)
VALUES(1)
RETURNING id

подключение к базе и запуск запроса проходит нормально,
но при попытке выполнить фетч isc_dsql_fetch, выводится ошибка: -502 Cursor is not open
13 окт 21, 11:02    [22383016]     Ответить | Цитировать Сообщить модератору
 Re: Переход FB2.5 -> FB4: INSERT INTO RETURNING ID  [new]
hvlad
Member

Откуда:
Сообщений: 11555
p_s_v,

ещё раз - как именно выполняется запрос ?

Если речь зашла об isc_dsql_fetch(), то значит какое-то понимание об ISC API присутствует.
13 окт 21, 11:25    [22383045]     Ответить | Цитировать Сообщить модератору
 Re: Переход FB2.5 -> FB4: INSERT INTO RETURNING ID  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54803

hvlad
он теперь возвращает курсор.

Разве это не только в пятёрке?..

p_s_v
при попытке выполнить фетч isc_dsql_fetch, выводится ошибка: -502 Cursor is not open

Не надо выполнять фетч, этот запрос возвращает синглетон. Достаточно
isc_dsql_execute2.

Posted via ActualForum NNTP Server 1.5

13 окт 21, 12:43    [22383091]     Ответить | Цитировать Сообщить модератору
 Re: Переход FB2.5 -> FB4: INSERT INTO RETURNING ID  [new]
p_s_v
Member

Откуда:
Сообщений: 7
Вызов идет в следующем порядке:

isc_attach_database(vErrorStatus,
strlen(cBasePath), cBasePath,
&pHandle, iDPB_Length, pcDPB);

char isc_tpb[] = {
isc_tpb_version3
, isc_tpb_concurrency
, isc_tpb_write
, isc_tpb_nowait
};


isc_start_transaction(
poIBConnect->vErrorStatus,
&pTransaction,
1,
pHandle,
(unsigned short)sizeof(isc_tpb),
isc_tpb);

isc_dsql_prepare(
oIBConnect->vErrorStatus,
&oIBTrans->pTransaction,
&stmt,
0,
(char*)sCmd[0],
oIBConnect->dialect,
sqldaResult);

isc_dsql_execute(
oIBConnect->vErrorStatus,
&oIBTrans->pTransaction,
&stmt,
oIBConnect->dialect,
sqldaParam);

bResult=isc_dsql_fetch(
((SQL_IBConnect*)poConnect)->vErrorStatus,
& stmt,
oIBConnect->dialect,
sqldaResult)==0; -- ошибка SQLCODE=-502 Cursor is not open


а как понять, что нужно вызывать isc_dsql_execute2 ?
код в программе это выглядит так:

{
USE_QUERY(pq);
pq->AddParam(id);
pq->AddResult(idNew);
pq->SetCommand("INSERT INTO C_TMP (ID)"
" SELECT GEN_ID(C_TMP_ID,1)"
" FROM C_TMP WHERE id = %"
" RETURNING ID");
pq->Run();
pq->Step(); -- вот здесь происходит isc_dsql_fetch и вываливается ошибка
}


из-за параметров транзакции не может быть проблемы?
13 окт 21, 13:18    [22383111]     Ответить | Цитировать Сообщить модератору
 Re: Переход FB2.5 -> FB4: INSERT INTO RETURNING ID  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54803
p_s_v
а как понять, что нужно вызывать isc_dsql_execute2 ?

Если запрос возвращает синглетон (включая select, возвращающий одну запись) -
можно вызывать isc_dsql_execute2. Если запрос не возвращает курсор (процедура
или в данном случае returning) - его нужно вызывать.

PS: А вот за insert-select-returning не скажу. Он, кажется, в старых версиях вообще должен быть запрещён, а в новых - таки нормально возвращать курсор. Так что как ни крути, а выглядит багом.

Сообщение было отредактировано: 13 окт 21, 13:12
13 окт 21, 13:22    [22383116]     Ответить | Цитировать Сообщить модератору
 Re: Переход FB2.5 -> FB4: INSERT INTO RETURNING ID  [new]
p_s_v
Member

Откуда:
Сообщений: 7
Та же ошибка и при запросе

INSERT INTO
VALUES ()
RETURNING ID


но на FB2.5 все работало, именно на FB4.0 появилась проблема
13 окт 21, 13:31    [22383122]     Ответить | Цитировать Сообщить модератору
 Re: Переход FB2.5 -> FB4: INSERT INTO RETURNING ID  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32896
Dimitry Sibiryakov
А вот за insert-select-returning не скажу. Он, кажется, в старых версиях вообще должен быть запрещён
он ещё в 2.0 появился, если не ошибаюсь.
13 окт 21, 13:33    [22383123]     Ответить | Цитировать Сообщить модератору
 Re: Переход FB2.5 -> FB4: INSERT INTO RETURNING ID  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54803

p_s_v
но на FB2.5 все работало, именно на FB4.0 появилась проблема

Вернись на 2.5 и проследи вызывается ли там isc_dsql_fetch.

Хотя, как я уже сказал, выглядит как баг. Фетч при вызове неселективной
процедуры обычно возвращал NO_DATA.

Posted via ActualForum NNTP Server 1.5

13 окт 21, 13:35    [22383126]     Ответить | Цитировать Сообщить модератору
 Re: Переход FB2.5 -> FB4: INSERT INTO RETURNING ID  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 11092
p_s_v,

оно и на 3.0 должно проявляться
13 окт 21, 13:35    [22383127]     Ответить | Цитировать Сообщить модератору
 Re: Переход FB2.5 -> FB4: INSERT INTO RETURNING ID  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54803

Мимопроходящий
он ещё в 2.0 появился, если не ошибаюсь.

Сам RETURNING - да, но для запросов, которые могут обработать более одной записи
он выкидывал ошибку то ли при выполнении то ли ещё при препарировании.

Posted via ActualForum NNTP Server 1.5

13 окт 21, 13:37    [22383130]     Ответить | Цитировать Сообщить модератору
 Re: Переход FB2.5 -> FB4: INSERT INTO RETURNING ID  [new]
p_s_v
Member

Откуда:
Сообщений: 7
Dimitry Sibiryakov,

код от версии сервера FB у нас не зависит, т.е. всегда вызывается isc_dsql_fetch

т.е. запросы INSERT RETURNING нужно по другому обрабатывать - через isc_dsql_execute2
- попробую, и напишу результат..

Спасибо!
13 окт 21, 13:40    [22383133]     Ответить | Цитировать Сообщить модератору
 Re: Переход FB2.5 -> FB4: INSERT INTO RETURNING ID  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54803

p_s_v
код от версии сервера FB у нас не зависит, т.е. всегда вызывается isc_dsql_fetch

Значит попробуй с сервером 4.0 использовать клиентскую библиотеку 2.5. Если
будет работать - пиши тикет об изменившемся поведении ISC API.

Posted via ActualForum NNTP Server 1.5

13 окт 21, 13:47    [22383138]     Ответить | Цитировать Сообщить модератору
 Re: Переход FB2.5 -> FB4: INSERT INTO RETURNING ID  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 11092
Dimitry Sibiryakov,

Дим, точно такой же баг был в PDO драйвере для PHP и проявлялся он ещё на 3.0.
Там просто добавили проверку типа оператора. Если он равен isc_info_sql_stmt_exec_procedure, то вызывали isc_dsql_execute2, без последующего isc_dsql_fetch
13 окт 21, 13:52    [22383143]     Ответить | Цитировать Сообщить модератору
 Re: Переход FB2.5 -> FB4: INSERT INTO RETURNING ID  [new]
p_s_v
Member

Откуда:
Сообщений: 7
Dimitry Sibiryakov

p_s_v
код от версии сервера FB у нас не зависит, т.е. всегда вызывается isc_dsql_fetch

Значит попробуй с сервером 4.0 использовать клиентскую библиотеку 2.5. Если
будет работать - пиши тикет об изменившемся поведении ISC API.



с клиентской библиотекой 2.5 не подключается к FB4.0....
13 окт 21, 13:55    [22383145]     Ответить | Цитировать Сообщить модератору
 Re: Переход FB2.5 -> FB4: INSERT INTO RETURNING ID  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 11092
p_s_v,

смотри мой пост выше
13 окт 21, 13:56    [22383146]     Ответить | Цитировать Сообщить модератору
 Re: Переход FB2.5 -> FB4: INSERT INTO RETURNING ID  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54803

Симонов Денис
Дим, точно такой же баг был в PDO драйвере для PHP и проявлялся он ещё на 3.0.

Это-то понятно, я просто помню, что раньше это было не так и не уверен если
изменение поведения API умышленное или побочка. С одной стороны, оно таки
поменялось, с другой - старое поведение было местами озадачивающим, так что
именно оно могло быть признано багом.

Надо бы ещё посмотреть как новый Адрианов код взаимодействует с
isc_dsql_execute2, но лень.

Posted via ActualForum NNTP Server 1.5

13 окт 21, 13:58    [22383148]     Ответить | Цитировать Сообщить модератору
 Re: Переход FB2.5 -> FB4: INSERT INTO RETURNING ID  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54803

p_s_v
с клиентской библиотекой 2.5 не подключается к FB4.0....

Надо настройки клиента подрихтовать чтобы подключалось.

Posted via ActualForum NNTP Server 1.5

13 окт 21, 13:59    [22383149]     Ответить | Цитировать Сообщить модератору
 Re: Переход FB2.5 -> FB4: INSERT INTO RETURNING ID  [new]
hvlad
Member

Откуда:
Сообщений: 11555
p_s_v
а как понять, что нужно вызывать isc_dsql_execute2 ?
После prepare нужно получить info и посмотреть на тип запроса.
Это есть в доке по IB6, это есть в любых компонентах доступа, есть и тут 22383143
13 окт 21, 14:05    [22383151]     Ответить | Цитировать Сообщить модератору
 Re: Переход FB2.5 -> FB4: INSERT INTO RETURNING ID  [new]
hvlad
Member

Откуда:
Сообщений: 11555
Dimitry Sibiryakov
hvlad
он теперь возвращает курсор.

Разве это не только в пятёрке?..
Это я на текст ошибки реагировал. А так - да, курсор пока только в мастере.
13 окт 21, 14:07    [22383152]     Ответить | Цитировать Сообщить модератору
 Re: Переход FB2.5 -> FB4: INSERT INTO RETURNING ID  [new]
ggreggory
Member

Откуда:
Сообщений: 199
pasergey

Как решить эту проблему?


При переходе на 3-ку с полуторки isc_dsql_fetch на определенных запросах стал возвращать dsql_cursor_not_open = 336003095. Исследовал вопрос года полтора назад, когда только начинал переходить, поэтому что к чему и как уже не помню. Добавил игнор этой ошибки (просто выставляю флаг EOF). С тех пор проблем не было.
13 окт 21, 14:25    [22383159]     Ответить | Цитировать Сообщить модератору
 Re: Переход FB2.5 -> FB4: INSERT INTO RETURNING ID  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 11092
ggreggory,

кривой хак, а как надо было смотри выше
13 окт 21, 15:09    [22383175]     Ответить | Цитировать Сообщить модератору
 Re: Переход FB2.5 -> FB4: INSERT INTO RETURNING ID  [new]
p_s_v
Member

Откуда:
Сообщений: 7
Симонов Денис
ggreggory,

кривой хак, а как надо было смотри выше



да, ошибку заглушить можно и вставка записи в базу пройдет, но я не получу результат, который возвращает RETURNING...
14 окт 21, 09:44    [22383466]     Ответить | Цитировать Сообщить модератору
 Re: Переход FB2.5 -> FB4: INSERT INTO RETURNING ID  [new]
p_s_v
Member

Откуда:
Сообщений: 7
Симонов Денис
Dimitry Sibiryakov,

Дим, точно такой же баг был в PDO драйвере для PHP и проявлялся он ещё на 3.0.
Там просто добавили проверку типа оператора. Если он равен isc_info_sql_stmt_exec_procedure, то вызывали isc_dsql_execute2, без последующего isc_dsql_fetch


- так получилось - сделал вызов isc_dsql_sql_info,
и если iStatement_Type==isc_info_sql_stmt_exec_procedure,
то вызываю isc_dsql_execute2,
а иначе как обычно isc_dsql_execute

всем спасибо!!!
14 окт 21, 09:48    [22383470]     Ответить | Цитировать Сообщить модератору
Все форумы / Firebird, InterBase Ответить