选择并计算相同的记录

时间:2015-03-12 17:45:59

标签: oracle stored-procedures plsql

在我的存储过程中,我有两个问题:

这里rec_count是out参数,cursor_name是out参数。

open cursor_name for
select <col list> from <table1 join table2 inner join...> on <join conditions> where <conditions>;

select count(*) into rec_count from <table1 join table2 inner join...> on <join conditions> where <conditions>;
  • 有没有办法可以一起选择和统计,因为我提供相同的连接条件和where子句?
  • 这会影响性能,还是SQL Optimizer会优化这两个查询?

2 个答案:

答案 0 :(得分:1)

您可以像这样对整个数据集进行分析计数 -

OPEN cursor_name for
   SELECT <col_list> , 
          count(*) over () as cnt 
   from <tables> <join conditions> <where clauses>;

这样,游标就会有一列,其中包含每行中所有行的计数。

答案 1 :(得分:1)

比你想到的更重要的问题。

  

如果另一个会话在您打开光标并选择计数之间同时提交事务怎么办?显然,光标的行的计数与您的select count(*)查询不匹配。

在获取最后一行之前,Oracle不知道行数。

如果您想要精确的行数,那么我会在现有的游标查询中坚持使用analytic count(*) over()