Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Oracle ResultSet C++ узнать количество строк / 25 сообщений из 25, страница 1 из 1
01.09.2015, 10:00
    #39040226
sitev_ru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle ResultSet C++ узнать количество строк
Подключаюсь к Oracle из C++. Как узнать количество строк в ResultSet?
...
Рейтинг: 0 / 0
01.09.2015, 11:24
    #39040340
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle ResultSet C++ узнать количество строк
На самом деле, во всех СУБД и всех клиентах единственный способ узнать количество строк в наборе данных -- это профетчить
(выбрать на клиента) все строки и посчитать их количество. Разные API типа ODBC и OLEDB имеют для этого специальные функции,
которые внутри, на самом деле, делают ровно то же самое -- считают профетченные строки.

И, чтобы предотвратить возможное возмущение, добавлю, что до выборки последней записи набора данных о количестве строк
в нём не знает даже сам сервер СУБД -- в момент начала работы с набором данных на клиенте (или в сервере -- не важно) набор только сформирован как запрос и подготовлен к выборке из него, но записей там ещё нет, они будут формироваться по мере надобности для использующего этот набор данных.
...
Рейтинг: 0 / 0
01.09.2015, 12:14
    #39040412
sitev_ru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle ResultSet C++ узнать количество строк
Получается это неправильный стиль программирования, сначала узнать количество строк, а потом взять данные в цикле?

Код: plaintext
1.
2.
3.
4.
5.
6.
	String sql = "select * from table1";
	int count = query->active(sql);
	for (int i = 0; i < count; i++) {
		String name = query->getFieldValue(i, "name");
		String about = query->getFieldValue(i, "about");
        }
...
Рейтинг: 0 / 0
01.09.2015, 12:30
    #39040435
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle ResultSet C++ узнать количество строк
sitev_ruПолучается это неправильный стиль программирования, сначала узнать
количество строк, а потом взять данные в цикле?
Да, совершенно неправильный.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
01.09.2015, 12:34
    #39040442
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle ResultSet C++ узнать количество строк
sitev_ruПолучается это неправильный стиль программирования, сначала узнать количество строк, а потом взять данные в цикле?
1. Ты вынужден дождаться пока придет весь результат запроса на клиента. Хотя можно было начитать обрабатывать по мере поступления.
2. Результат сначала должен быть как-то закэширован чтобы потом ты его из кэша вычитывал, т.е. лишний расход памяти.

И все это только ради того чтобы заранее узнать сколько записей, при том что для решения основной задачи это не надо, надо только чтобы цикл организовать.
...
Рейтинг: 0 / 0
01.09.2015, 12:35
    #39040443
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle ResultSet C++ узнать количество строк
sitev_ruПолучается это неправильный стиль программирования, сначала узнать количество строк, а потом взять данные в цикле?

Код: plaintext
1.
2.
3.
4.
5.
6.
	String sql = "select * from table1";
	int count = query->active(sql);
	for (int i = 0; i < count; i++) {
		String name = query->getFieldValue(i, "name");
		String about = query->getFieldValue(i, "about");
        }



Касательно работы с СУБД -- да. Антипаттерн.
...
Рейтинг: 0 / 0
01.09.2015, 13:07
    #39040484
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle ResultSet C++ узнать количество строк
sitev_ruПолучается это неправильный стиль программирования, сначала узнать количество строк, а потом взять данные в цикле?
Не в стиле дело. Ты делаешь в 2 транзакции. А значит что ты узнал одно количество строк. Потом прошёл ненулевой
интервал времени. За это время в БД что-то поменялось и ты извлекаешь данные как будто уже из "другой БД".
И количество там будет другое.

Это называется несогласованность.

Решений твоей проблемы много. Ответы вобщем зависят от возможностей самой DBMS. Например зафикисровать
снапшот и работать с ним. Или использовать выборку 1 раз и для подсчёта и для публикации.
...
Рейтинг: 0 / 0
01.09.2015, 14:21
    #39040561
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle ResultSet C++ узнать количество строк
maytonsitev_ruПолучается это неправильный стиль программирования, сначала узнать количество строк, а потом взять данные в цикле?
Не в стиле дело. Ты делаешь в 2 транзакции. А значит что ты узнал одно количество строк. Потом прошёл ненулевой
интервал времени. За это время в БД что-то поменялось и ты извлекаешь данные как будто уже из "другой БД".
И количество там будет другое.

Это называется несогласованность.


Ну про это ж разговора вообще не было...
...
Рейтинг: 0 / 0
01.09.2015, 15:28
    #39040661
sitev_ru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle ResultSet C++ узнать количество строк
Обычно использую такую конструкцию для вывода информации на экран. Изначально предполагается, что будет немного информации и поэтому такой цикл прокатывал. Но теперь получается, что нужно переходить на новую схему...
...
Рейтинг: 0 / 0
01.09.2015, 15:45
    #39040697
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle ResultSet C++ узнать количество строк
А зачем тебе количество знать? Цикл можно по другому переписать.
...
Рейтинг: 0 / 0
01.09.2015, 16:22
    #39040775
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle ResultSet C++ узнать количество строк
sitev_ruОбычно использую такую конструкцию для вывода информации на экран.
Смысл? Показать пользователю что процесс идет? Если так, то им пофиг сколько до конца осталось (за исключением каких-то очень долгих расчетов). Достаточно показать сколько обработано. Показывай "Обработано ХХХ записей ..." и обновляй каждые полсекунды-секунду (чтобы вывод оповещения не затормаживал сам расчет).
...
Рейтинг: 0 / 0
01.09.2015, 16:27
    #39040792
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle ResultSet C++ узнать количество строк
Для сложного (5 и более JOINS) запроса очень сложно нарисовать progress-bar. Особенно в фазе execute.
Тут конечно всё от dbms зависит но мои попытки сделать оценку оставшегося времени или нарисовать %
шкалу ничем не закончились. Возможно это фундаментальный недостаток реляционной алгебры.
Для сложных соединений отклик - непрогнозируем.
...
Рейтинг: 0 / 0
01.09.2015, 19:19
    #39040924
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle ResultSet C++ узнать количество строк
maytonДля сложного (5 и более JOINS) запроса очень сложно нарисовать progress-bar.

Не сложно -- НЕВОЗМОЖНО!
...
Рейтинг: 0 / 0
01.09.2015, 23:46
    #39041000
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle ResultSet C++ узнать количество строк
sitev_ruПодключаюсь к Oracle из C++. Как узнать количество строк в ResultSet?если это оракл, то в запрос можно добавить оконную функцию, которая и посчитает "количество строк в ResultSet"

Код: plsql
1.
SELECT id, COUNT(id) OVER (PARTITION BY id) cnt FROM mytable
...
Рейтинг: 0 / 0
02.09.2015, 00:44
    #39041025
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle ResultSet C++ узнать количество строк
Relic Huntersitev_ruПодключаюсь к Oracle из C++. Как узнать количество строк в ResultSet?если это оракл, то в запрос можно добавить оконную функцию, которая и посчитает "количество строк в ResultSet"

Код: plsql
1.
SELECT id, COUNT(id) OVER (PARTITION BY id) cnt FROM mytable

А что тут общего с количеством строк?
И вообще, оконные функции это группировка. А о ней никто не заикался.
...
Рейтинг: 0 / 0
02.09.2015, 02:18
    #39041041
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle ResultSet C++ узнать количество строк
White Owl,

Колонка "CNT" это и есть количество строк :)
...
Рейтинг: 0 / 0
02.09.2015, 02:20
    #39041042
Relic Hunter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle ResultSet C++ узнать количество строк
Это такой древний туннгуский способ получить в одном запросе сами данные и их количество.
...
Рейтинг: 0 / 0
02.09.2015, 02:45
    #39041049
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle ResultSet C++ узнать количество строк
Relic HunterWhite Owl,

Колонка "CNT" это и есть количество строк :)Это не количество строк, а количество записей имеющих одинаковый id.
...
Рейтинг: 0 / 0
02.09.2015, 08:06
    #39041082
sitev_ru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle ResultSet C++ узнать количество строк
mayton,
Можно, но я так привык писать на MySQL... Вот отрывок исходника https://github.com/sitev/cjCms/blob/master/src/siteManager.cpp:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
	String sql = "select * from sites order by id";
	if (query->exec(sql)) {
		if (query->storeResult()) {
			int count = query->getRowCount();
			printf("count = %d\n", count);
			for (int i = 0; i < count; i++) {
				int siteId = query->getFieldValue(i, "id").toInt();
				string url = query->getFieldValue(i, "url").toString8();
				WebSite *ws = new WebSite(this, url, siteId);



Теперь мои наработки должны заработать под Oracle...

Хотя уже решил всё переписать с помощью next()
...
Рейтинг: 0 / 0
02.09.2015, 09:41
    #39041141
sitev_ru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle ResultSet C++ узнать количество строк
Вывожу новости... Последняя новость должна выводиться чуть по-другому... Как определить, что она последняя?
...
Рейтинг: 0 / 0
02.09.2015, 09:44
    #39041143
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle ResultSet C++ узнать количество строк
sitev_ruВывожу новости... Последняя новость должна выводиться чуть по-другому... Как определить, что она последняя?
Выводить в опозданием на один шаг. Т.е. прочитал, запомнил, перешел на следующую, обрабатывай запомненное.
...
Рейтинг: 0 / 0
02.09.2015, 10:09
    #39041172
sitev_ru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle ResultSet C++ узнать количество строк
Dima T,

я конечно думал об этом... но не думал, что придётся так и реализовать))
...
Рейтинг: 0 / 0
02.09.2015, 10:11
    #39041174
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle ResultSet C++ узнать количество строк
sitev_ruDima T,

я конечно думал об этом... но не думал, что придётся так и реализовать))
План Б: отсортировать в обратном порядке, тогда последний станет первым :)
...
Рейтинг: 0 / 0
02.09.2015, 10:21
    #39041186
sitev_ru
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle ResultSet C++ узнать количество строк
Dima T,

Чёрт! Ты, гений! В это чё-то есть... хотя может быть это только усложнит программу, надо подумать)
...
Рейтинг: 0 / 0
02.09.2015, 10:32
    #39041196
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Oracle ResultSet C++ узнать количество строк
sitev_ruМожно, но я так привык писать на MySQL... Вот отрывок исходника https://github.com/sitev/cjCms/blob/master/src/siteManager.cpp:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
	String sql = "select * from sites order by id";
	if (query->exec(sql)) {
		if (query->storeResult()) {
			int count = query->getRowCount();
			printf("count = %d\n", count);
			for (int i = 0; i < count; i++) {
				int siteId = query->getFieldValue(i, "id").toInt();
				string url = query->getFieldValue(i, "url").toString8();
				WebSite *ws = new WebSite(this, url, siteId);

Для MySQL это тоже неправильный подход.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Oracle ResultSet C++ узнать количество строк / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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