在我的存储过程中,我有两个问题:
这里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>;
答案 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()
。