Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Konstantin-78
Member

Откуда: Земля
Сообщений: 395
Доброе время суток, такой вопрос:

У меня DELPHI 10.2, ibx19,19, ни как не найду информацию о поддержке IBX оператора RETURNING.
Я его хочу использовать в IBQuery (после вставки строки), ну как тут уже писали, предыдущие версии его не поддерживали.
2 окт 18, 13:45    [21692597]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Любезный
Member

Откуда:
Сообщений: 566
ЕМНИП, такого предиката в InterBase нет. Следовательно, в IBX он без допиливания не поддерживается.
2 окт 18, 13:47    [21692600]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Konstantin-78
Member

Откуда: Земля
Сообщений: 395
Любезный,

Значит без внутренней процедуры не обойтись?
2 окт 18, 13:51    [21692608]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Котовасия
Member

Откуда:
Сообщений: 1187
Konstantin-78,

а тупо попробовать?
2 окт 18, 13:58    [21692617]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3631
Что-то мне кажется, что если тупо засунуть INSERT RETURNING в обычный TIBQuery или TIBDataset и сделать Open, то всё заработает само.
2 окт 18, 14:12    [21692645]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24623
YuRock
Что-то мне кажется

Наверное еще никого это простая мысль не посещала. :)
2 окт 18, 14:14    [21692651]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Котовасия
Member

Откуда:
Сообщений: 1187
YuRock
Что-то мне кажется, что если тупо засунуть INSERT RETURNING в обычный TIBQuery или TIBDataset и сделать Open, то всё заработает само.

Прикинь, оно и работает.
2 окт 18, 14:16    [21692657]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Konstantin-78
Member

Откуда: Земля
Сообщений: 395
Котовасия
Прикинь, оно и работает.


Типа так?:

var
  q: integer;
begin
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Text := 'insert into Tab (ID, STR) values (GEN_ID(GN, 1), :STR) returning ID';
IBQuery1.Params[0].AsString := 'qwe';
IBQuery1.Open;
IBTransaction1.CommitRetaining;
q := IBQuery1.ParamByName('ID').Value;
end;


с ошибкой на "q := IBQuery1.ParamByName('ID').Value;"
'IBQuery1: List index out of bounds (0)'.
2 окт 18, 14:23    [21692684]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Dimitry Sibiryakov
Member

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

Konstantin-78
Типа так?:

Нет. Немного не так. Любые значения возвращаются через Fields. И запрос с RETURNING
рассматривается не как select, а как execute procedure.

Posted via ActualForum NNTP Server 1.5

2 окт 18, 14:29    [21692695]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Konstantin-78
Member

Откуда: Земля
Сообщений: 395
Dimitry Sibiryakov
Нет. Немного не так. Любые значения возвращаются через Fields. И запрос с RETURNING
рассматривается не как select, а как execute procedure.


Вы имели в виду вот так?

var
  q: integer;
begin
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Text := 'insert into Tab (ID, STR) values (GEN_ID(GN, 1), :STR) returning ID';
IBQuery1.Params[0].AsString := 'qwe1';
IBQuery1.ExecSQL;
IBTransaction1.CommitRetaining;
q := IBQuery1.Fields[0].AsInteger;
end;
2 окт 18, 14:40    [21692721]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Dimitry Sibiryakov
Member

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

Konstantin-78
Вы имели в виду вот так?

За такой код я бы отрывал руки с запретом на профессию, но в целом таки да, как-то так.

Posted via ActualForum NNTP Server 1.5

2 окт 18, 14:45    [21692727]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Котовасия
Member

Откуда:
Сообщений: 1187
Konstantin-78,

только что проверил - работает:

var
  IBSQL1 : TIBSQL;
...
begin
...
  IBSQL1.SQL.Text := 'insert into t (name) values (''Вася'') returning id';
  IBSQL1.ExecQuery;
  id := IBSQL1.FieldByName('id').AsInteger;
2 окт 18, 14:46    [21692728]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3631
Konstantin-78,

Запомни простую истину: никогда, накогда не используй CommitRetaining/RollbackRetaining.
Иначе два варианта:
1. Ты сменишь профессию, а твоё поделие придется переделывать другому;
2. Тебе самому придется всё переделывать со временем.
2 окт 18, 14:54    [21692748]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Котовасия
Member

Откуда:
Сообщений: 1187
YuRock
Konstantin-78,

Запомни простую истину: никогда, накогда не используй CommitRetaining/RollbackRetaining.
Иначе два варианта:
1. Ты сменишь профессию, а твоё поделие придется переделывать другому;
2. Тебе самому придется всё переделывать со временем.

Прямо вот так "никогда"? Может, тогда сразу расскажешь, как редактировать данные в ibx датасете, чтобы он не закрывался по каждому коммиту/роллбэку?
2 окт 18, 14:58    [21692756]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24623
Котовасия
YuRock
Konstantin-78,

Запомни простую истину: никогда, накогда не используй CommitRetaining/RollbackRetaining.
Иначе два варианта:
1. Ты сменишь профессию, а твоё поделие придется переделывать другому;
2. Тебе самому придется всё переделывать со временем.

Прямо вот так "никогда"? Может, тогда сразу расскажешь, как редактировать данные в ibx датасете, чтобы он не закрывался по каждому коммиту/роллбэку?

Использовать датасеты, которые поддерживают 2 транзакции.
Читающая длинная, пишущая - короткая.
2 окт 18, 15:26    [21692814]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3631
Котовасия
Может, тогда сразу расскажешь, как редактировать данные в ibx датасете, чтобы он не закрывался по каждому коммиту/роллбэку?

Ты имеешь ввиду - редактировать гриды "в гриде"? Зачем это вообще надо? Если уж надо - делаешь форму редактирования запись, после редактирования - стартуешь пишущую транзакцию, делаешь инсерт/апдейт, commit, refresh датасета, всё.

Либо использовать датасеты с двумя транзакциями, как сказал ужа wadman. Но, имхо, это нужно чаще всего для редактирования гридов в гридах, что я считаю уродством.
2 окт 18, 15:38    [21692838]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3631
А датасет должен быть открыт в read-only транзакции, ессно.
2 окт 18, 15:39    [21692840]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Котовасия
Member

Откуда:
Сообщений: 1187
wadman
Котовасия
пропущено...

Прямо вот так "никогда"? Может, тогда сразу расскажешь, как редактировать данные в ibx датасете, чтобы он не закрывался по каждому коммиту/роллбэку?

Использовать датасеты, которые поддерживают 2 транзакции.
Читающая длинная, пишущая - короткая.

Т.е., не использовать датасеты ibx. Или использовать их после допиливания.

А чем плоха длинная "пишущая" транзакция "стандартного" датасета ibx, которая 99,999% времени ничего не пишет, кроме короткого быстрого post с последующим немедленным CommitRetaining? Расскажи, пожалуйста.
2 окт 18, 15:40    [21692843]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Котовасия
Member

Откуда:
Сообщений: 1187
YuRock
А датасет должен быть открыт в read-only транзакции, ессно.
Почему "естественно"?
Ну вот если в этой транзакции данные не модифицируются - в чем проблема?
2 окт 18, 15:42    [21692850]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6127
Котовасия
YuRock
А датасет должен быть открыт в read-only транзакции, ессно.
Почему "естественно"?
Ну вот если в этой транзакции данные не модифицируются - в чем проблема?


В этой - не модифицируются. В других - вполне себе (у других пользователей). Получаешь накопление ненужных версий записи.
2 окт 18, 16:04    [21692896]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Котовасия
Member

Откуда:
Сообщений: 1187
DarkMaster
Котовасия
пропущено...
Почему "естественно"?
Ну вот если в этой транзакции данные не модифицируются - в чем проблема?


В этой - не модифицируются. В других - вполне себе (у других пользователей). Получаешь накопление ненужных версий записи.

После CommitRetaining начнут копиться версии?
2 окт 18, 16:11    [21692904]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Котовасия
Member

Откуда:
Сообщений: 1187
Котовасия
DarkMaster
пропущено...


В этой - не модифицируются. В других - вполне себе (у других пользователей). Получаешь накопление ненужных версий записи.

После CommitRetaining начнут копиться версии?

Да, kdv пишет, что такое может случиться, в общем случае следует избегать Retaining, но для датасетов ibx вариантов нет, или допиливать или изменения в отдельной транзакции делать, ручками; или таки c Retainig - но учитывать ситуацию и понимать.
2 окт 18, 16:44    [21692976]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 27657
Konstantin-78
IBTransaction1.CommitRetaining;

вот зачем такую стыдобу писать?
Мало того, CommitRetaining, так он еще между открытием запроса и получением значения. Кто вас такому научил?
Выполнил insert, получил данные, сделал commit, если надо. CommitRetaining для insert/update/delete ни к селу, ни к городу.
2 окт 18, 17:36    [21693049]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 688
Т.е., не использовать датасеты ibx. Или использовать их после допиливания.


Со стандартными компонентами IBX приходится использовать in-memory-dataset (например, TRXMemoryData или что-нибудь посвежей) и его подключать к гриду. В этом случае:
1. Обеспечивается независимость от качества соединения с БД (данные не исчезнут при дисконнекте)
2. При добавлении / изменении / удалении записи не требуется переоткрывать весь датасет
3. По факту получается не очень много дополнительного кода.
2 окт 18, 17:49    [21693067]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Котовасия
Member

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

да ну нафиг, уж лучше старые фибы.
2 окт 18, 17:54    [21693074]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 688
YuRock
Запомни простую истину: никогда, накогда не используй CommitRetaining/RollbackRetaining.


Я нашёл одно полезное свойство CommitRetaining: если при решении задачи требуется обработать множество строк (например, финансовые операции) и для каждой операции требуется закоммитить транзакцию, то с CommitRetaining запросы с параметрами будут выполнены быстрее, поскольку не будет каждый раз заново выполняться операция PREPARE. Если база находится на отдельном компьютере, а скорость соединения не особо быстрая, то ускорение может быть в несколько раз.
2 окт 18, 17:56    [21693075]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3631
Котовасия
А чем плоха длинная "пишущая" транзакция "стандартного" датасета ibx, которая 99,999% времени ничего не пишет, кроме короткого быстрого post с последующим немедленным CommitRetaining? Расскажи, пожалуйста.

Тем, что эта пишущая транзакция сборке мусора будет очень мешать. Если она будет открыта несколько дней (и ничего не делать при этом, как ты говоришь - висеть себе и всё) - то эти несколько дней не будет сборки мусора.
2 окт 18, 17:57    [21693078]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Dimitry Sibiryakov
Member

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

DmSer
с CommitRetaining запросы с параметрами будут выполнены быстрее, поскольку не будет каждый
раз заново выполняться операция PREPARE.

Если твои компоненты доступа распрепарируют запрос при коммите, это их проблемы. Обычно
препарированный запрос способен нормально жить аж до дисконнекта.

Posted via ActualForum NNTP Server 1.5

2 окт 18, 17:59    [21693081]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3631
DmSer
Я нашёл одно полезное свойство CommitRetaining: если при решении задачи требуется обработать множество строк (например, финансовые операции) и для каждой операции требуется закоммитить транзакцию, то с CommitRetaining запросы с параметрами будут выполнены быстрее, поскольку не будет каждый раз заново выполняться операция PREPARE

Разве Prepare делается для каждой транзакции? Не очень верю.

Я использую CommitRetaining в одном месте: для мониторинга доступности базы. RORC-транзакции делаю CommitRetaining по таймеру.
2 окт 18, 18:00    [21693082]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 688
Котовасия
DmSer,

да ну нафиг, уж лучше старые фибы.


Конечно они лучше, тем более сейчас они вроде халявные :)
Но вот встанет у меня задача переделать один мой проект (там пара-тройка сотен тыщ строк кода) под Линукс - опаньки, а там есть для Лазаруса допиленный IBX, т.е. задачу можно будет решить за ограниченное время, учитывая, что в проекте не менее тысячи различных запросов к БД.
А с фибами будет всё намного сложнее.


Кстати, никто проверял, в последних версиях Delphi под Линукс компоненты IBX случайно с Firebird не умеют работать?
2 окт 18, 18:04    [21693089]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 688
YuRock
Разве Prepare делается для каждой транзакции? Не очень верю.


Увы, в IBX оно так!
2 окт 18, 18:06    [21693091]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10642
DmSer
Увы, в IBX оно так!
Тынц
ISC_STATUS isc_dsql_prepare(
 ISC_STATUS *status_vector,
 isc_tr_handle *trans_handle,
 isc_stmt_handle *stmt_handle,
 unsigned short length,
 char *statement,
 unsigned short dialect,
 XSQLDA *xsqlda);

При чем здесь IBX?
2 окт 18, 18:10    [21693094]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 688
_Vasilisk_
DmSer
Увы, в IBX оно так!
Тынц
ISC_STATUS isc_dsql_prepare(
 ISC_STATUS *status_vector,
 isc_tr_handle *trans_handle,
 isc_stmt_handle *stmt_handle,
 unsigned short length,
 char *statement,
 unsigned short dialect,
 XSQLDA *xsqlda);

При чем здесь IBX?


Прочитал статью по ссылке, просмотрел функцию isc_dsql_prepare, насладился жёлтой подсветкой. Всё понравилось. А делать-то с этим теперь что?
2 окт 18, 18:25    [21693111]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Dimitry Sibiryakov
Member

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

_Vasilisk_
При чем здесь IBX?

Ты не поверишь, но запрос не ограничен рамками транзакции в которой его препарировали.
Выполняться он способен и в любой другой. Хоть это и влечёт за собой забавные спецэффекты
на динамических метаданных.

Posted via ActualForum NNTP Server 1.5

2 окт 18, 18:31    [21693125]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10642
DmSer
А делать-то с этим теперь что?
Проблема не в IBX, а в API Interbase. Стейтментов вне транзакции не существует
2 окт 18, 18:32    [21693127]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10642
Dimitry Sibiryakov
запрос не ограничен рамками транзакции в которой его препарировали.
Интересный функционал. Он где-то документирован или просто "так работает"?
2 окт 18, 18:34    [21693131]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Dimitry Sibiryakov
Member

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

_Vasilisk_
Стейтментов вне транзакции не существует

Это ты зря так думаешь:
isc_dsql_allocate_statement(
   ISC_STATUS *status_vector,
   isc_db_handle *db_handle,
   isc_stmt_handle *stmt_handle);

Где здесь транзакция?

Posted via ActualForum NNTP Server 1.5

2 окт 18, 18:37    [21693134]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10642
Dimitry Sibiryakov
Где здесь транзакция?
Это аллок.

При создании объекта память тоже как-бы принадлежит всему процессу, но объект доступен только по месту создания. А если кто-то полезет по сырому указателю к этому объекту, то ССЗБ
2 окт 18, 18:43    [21693144]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Dimitry Sibiryakov
Member

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

_Vasilisk_
Он где-то документирован или просто "так работает"?

API guide
After a statement is prepared, it is available for execution as many times
as necessary during the current session.

Ну и то, что в execute требуется хэндл транзакции как бы тоже намекает. Там, где запросы
привязаны к транзакции, такого не допускают.

Posted via ActualForum NNTP Server 1.5

2 окт 18, 18:53    [21693160]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3631
Недавно писал проект на апи. Создавали и сразу препарировал запрос один раз, в одной транзакции. А затем использую этот хэндл запроса с другими транзакциями. Месяцами работает.
2 окт 18, 20:30    [21693296]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить