![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как подбить количество возращаемых записей? [D5, IB5.x]
YuraKiller © (2003-05-25 15:38:00)Мне нужно узнать количество записей результатирующего набора.
Как это можно красиво сделать?
Запрос например:select * from main where type=10 and code>100
Как это можно сделать не посылая :select count(*) from main where type=10 and code>100ещё раз.
Может есть какое-то свойство или оператор?...
Danilka (2003-05-28 08:00:00) [1]Proton © (28.05.03 07:55)
Ладно, признаюсь, с моей стороны все посты в этой ветке - просто флуд, сначала на:
Verg © (27.05.03 08:46)
на то утверждение, что если одна транзакция меняет данные, то транзакция стартовавшая раньше их не видит, я начал флудить что в могопользовательских БД всегда есть вероятность того, что данные устарели.
Можно их смело прибить.
Proton (2003-05-28 07:55:00) [2]Наверное в данном случае пользователя устроит "приблизительное" количеество записей. А если он будет выводить данные то он всегда сможе использовать recordcount.
YuraKiller (2003-05-28 00:50:00) [3]Да.., ну Вы и бадягу замесили.. :-))
Orlan Master (2003-05-27 13:41:00) [4]На всякий случай: именно там, где есть транзакции, можно с уверенностью сказать, сколько записей было на момент транзакции. Просто операцию по расчету кол-ва записей необходимо производить ВНУТРИ ОДНОЙ И ТОЙ ЖЕ ТРАНЗАКЦИИ, а уровень изоляции не должен быть DirtyRead (ReadUncommited). Для MSSQL, например, если выборка делается из хранимки, то можно кол-во записей впендюрить в переменную, и ее значение считать непосредственно из переменной. Иными словами, из хранимки можно одновременно получить и селектовую выборку и значения возвращаемых переменных.
М.б. в IB есть нечто похожее.
Danilka (2003-05-27 09:19:00) [5]Alexandr © (27.05.03 09:01)
Ладно, разжую, там где есть транзакции, невозможно на 100% с уверенностью сказать, сколько реально записей в таблице в данный момент.
Конечно, таблицы и задачи, в которых идет вставка новых записей несколько штук в секунду очень-очень редки, и в любом случае, для них нет необходимости смотреть кол-во записей.
В то-же время, при наличии даже двух пользователей есть какая-то вероятность, что количество, например, счетов-фактур через секунду будет на 1 больше, чем только-что показал count(*)
Да и там где транзакций нет, тоже нельзя с 100% уверенностью сказать что секунду назад сделаное count(*) - правильное. :))
Danilka (2003-05-27 09:11:00) [6]Alexandr © (27.05.03 09:01)
тема ветки, вообще-то IB5.x
к тому-же, похоже, даже смайлики не на всех действуют :))
Verg (2003-05-27 09:06:00) [7]
> Alexandr © (27.05.03 09:01)
Мне-то чего хочется?
Вопрос по-моему "простой" - где берут RowsAffected в IB?
Alexandr (2003-05-27 09:01:00) [8]2Verg © если очень хочется, сделай repeatableRead транзакцию.
2Danilka © DBF? Paradox? Все что вы пишите есть бред сивой кобылы.
Danilka (2003-05-27 08:54:00) [9]Verg © (27.05.03 08:46)
угу, и для "обьективной реальности" остается только уйти нафиг с IB на сервак поддерживающий транзакции Dirty Read, и на нем уже делать count(*)
;))
Verg (2003-05-27 08:46:00) [10]Если транзакция readcommited,
select * from main where type=10 and code>100
... а здесь в другой транзакции в main были добавлены/удалены записи удовлетворяющие условию и сделан commit, то
select count(*) from
main where type=10 and code>100 ещё раз.
...будет ли результат второго запроса равен колечеству выбранных записей в первом?
YuraKiller (2003-05-27 01:33:00) [11]Пасибо!
DrPass (2003-05-25 21:44:00) [12]select count(*) - это и есть самый красивый и разумный вариант
Sergey Masloff (2003-05-25 20:17:00) [13]>Как это можно сделать не посылая : select count(*) from main >where type=10 and code>100 ещё раз.
Все остальные способы приводят к фетчу ВСЕХ записей на клиента. Так что хорошо подумай, может стоит сделать select count(*) и узнать что там таких записей полтора миллиона или узнать об этом же после получаса ожидания пока они тебе на клиента приползут?
Engel (2003-05-25 15:41:00) [14]query.recordcount