2009-10-28 2 views
1

В настоящее время мне нужно запустить два запроса, чтобы получить как общее количество элементов в моем наборе результатов, так и в наборе результатов. Можно ли просто получить счетчик результатов, а также набор результатов за один проход к базе данных. Я пытаюсь оптимизировать свой код, поэтому мне не нужно делать 2 прохода в базу данных, так как эти отдельные команды выбора уже занимают минуты для запуска. Я ищу решение как в Oracle, так и в sqs sql, потому что я использую оба. Я также использую библиотеки доступа Microsoft Oracle для доступа к базе данных Oracle, а не к библиотекам доступа Oracle.Возможно ли получить результат с номером строки с результатами запроса?

+0

Какой язык вы используете? –

+0

C# в среде ASP.net. – EverTheLearner

ответ

1

Не существует свойства OracleCommand или oracleDataReader, который показывает извлеченные строки. Количество строк известно после fetchin всех строк.

Но Если вы выберете все данные в набор результатов, то у вас есть количество строк в resultset.Tables[0].Rows.Count, как указано выше. Это не требует дополнительных затрат на базу данных, поскольку граф является собственностью коллекции строк. Номер индекса зависит от количества таблиц в вашем наборе результатов.

0

Если вы выполняете итерацию через результирующий набор, не будет ли возможно увеличивать счетчик на каждой итерации?

Возможно, вам нужна тактика, например, добавить столбец count(*) as RESULTSET_SIZE?

+0

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

2

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

http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/functions032.htm#i82697

select a.*, 
     count(*) over() totalRows 
    from table1 a; 
+0

Хорошее предложение. Но как бы вы могли прочитать столбец с помощью OracleDataReader? Использование метода GetInt32 фактически вызывает InvalidCastException. – rmoestl

+0

Это просто дополнительный столбец для запроса (похожий только на count (*)), поэтому вы можете выводить его точно так же, как и любой другой псевдонимов. –

+0

На самом деле я понял, что он работает при использовании 'Convert.ToInt32 (reader.GetDecimal (index))' – rmoestl

1

ОК это может быть то, что вы после: @@ROWCOUNT

возвращает количество строк, затронутых пользователей последней операции базы данных. Так что вам не нужно, чтобы добавить столбец или сделать еще один проход, просто запрос затем попросить @@ ROWCOUNT:

SELECT @@ ROWCOUNT как «Rows_Returned»

EDIT:

Это работает только для SQL-сервер. Для Oracle используется SQL% Rowcount

Надеюсь, что это поможет

+0

Это справедливо для SQL Server; вопрос помечен для Oracle. Вы бы использовали SQL% ROWCOUNT для Oracle ... –

+0

Фактически OP после решения SQL Server и Oracle, –

Смежные вопросы