次のような場所で大規模なクエリを実行しようとしています。
詳細行をクエリしてから、
返された結果に基づいて集計を実行します
基本的に、データ集約型のクエリを1回実行し、1つのクエリから要約値と詳細値の両方を取得します。これは、クエリが非常に集中的であるためです。フロントエンドアプリケーションを使用してこれを行うためのより良い方法があることは確かです(たとえば、SQLの詳細行、フロントエンドで集計しますか?)が、基本的に1つの選択を使用してPL/SQLでこれをすべて行う方法を知りたいですdbに対して(パフォーマンス上の理由から、基本的に同じラージSelectを2回呼び出したくない)(この時点で、1つのクエリでそれを実行したい理由は頑固と呼ばれる可能性があります...つまり、より良い方法、それができるかどうか知りたいです)。
基本的な「詳細レベル」の結果セットを取得する方法を知っています。このクエリは、次のようなデータを返します。
UPC-Region-ProjectType-TotalAssignments-IncompleteAssignments
つまり、10個のレコードがあるとします。
10-AX-20-10
11-BX-10-5
12-CY-30-15
13-CZ-20-10
10-5年度
15-BX-30-15
16-CZ-20-10
17-BY-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
プロジェクトタイプXIncompl割り当て:45
プロジェクトタイプY..。
プロジェクトタイプZ..。
次に、両方の結果セット(Summary + Detail)を呼び出し元のアプリケーションに返します。
詳細クエリを一時テーブルで実行し、そこで集計を選択/実行して、2番目の「要約レベル」クエリを作成するというアイデアだと思います。次に、2つの結果セットを2つのリフレクターとして返します。
しかし、私はアイデアを受け入れています...
私の最初の試みは次のとおりです。
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には何も含まれていません。おそらく、ここでは完全に間違った方向に進んでいると感じています(より良い方法があるということです)。
ご協力いただきありがとうございます。