我正在尝试在我想要的地方执行大型查询:
查询明细行,然后
根据返回的结果执行聚合
本质上,我想执行我的数据密集型查询一次,并从一个查询中获取摘要值和详细信息值,因为查询非常密集。我确信有更好的方法可以使用前端应用程序(例如 SQL 中的详细行,前端聚合?),但我想知道如何在 PL/SQL 中使用基本上一个选择来完成这一切针对数据库(出于性能原因,我不想调用本质上相同的大 Select 两次)(此时,我想要在一个查询中执行此操作的原因可能被称为固执......即即使有一个更好的方法,我想知道它是否可以完成)。
我知道如何获得基本的“细节级别”结果集。该查询将返回如下数据:
UPC-Region-ProjectType-TotalAssignments-IncompleteAssignments
所以说我有10条记录:
10-AX-20-10
11-BX-10-5
12-CY-30-15
13-CZ-20-10
14-AY-10-5
15-BX-30-15
16-CZ-20-10
17-10-5
18-CZ-30-15
19-AX-20-10
20-BX-10-5
我希望能够执行查询,然后对该结果集执行聚合,例如:
A区项目:3
A区总分配:50
A区未完成分配:25
B区...
C区...
项目类型 X 项目:5
项目类型 X 总分配:90
项目类型 X 未完成分配:45
项目类型 Y...
项目类型 Z...
然后将两个结果集(摘要 + 详细信息)返回给调用应用程序。
我想这个想法是将详细信息查询运行到临时表中,然后在那里选择/执行聚合以构建第二个“摘要级别”查询。然后将两个结果集作为两个引用返回。
但我对想法持开放态度......
我最初的尝试是:
type rec_projects is record
(record matching my DetailsSQL)
/* record variable */
project_resultset rec_projects;
/* cursor variable */
OPEN cursorvar1 FOR
select
upc,
region,
project_type,
tot_assigns,
incompl_assigns
...
然后我:
loop
fetch cursorvar1 into project_resultset;
exit when cursorvar1%NOTFOUND;
/* perform row-by-row aggregations into variables */
If project_resultset.region = 'A'
then
numAProj := numAProj + 1;
numATotalAssign := numATotalAssign + project_resultset.Totassigns;
numAIncomplAssign := numAIncomplAssign + project_resultset.Incomplassigns;
and so on...
end loop;
然后打开另一个 refcursor var - 从 DUAL 中选择变量:
open cursorvar2 for
select
numAProj, numATotalAssign, numAIncomplAssign, etc, etc from dual;
最后:
cur_out1 := cursorvar1;
cur_out2 := cursorvar2;
不工作... cursorvar1 似乎加载正常,我进入循环。但是我没有在 cursorvar2 中得到任何结果,只是觉得我可能完全走错了路(有更好的方法来做到这一点)
谢谢你的帮助。