プロシージャによって呼び出される関数で 2 つの sum() を使用すると、問題が発生しました。入力された結果は別のものになりました。次の表、関数、および手順は、私が試したものです。PS - 単一の sum(x) がある場合は正常に動作します。
DROP TABLE MATCH;
CREATE TABLE MATCH
(M_ID VARCHAR2 (4) NOT NULL,
HT_ID VARCHAR2 (4),
AT_ID VARCHAR2 (4),
P_F NUMBER (3),
P_A NUMBER (3));
INSERT INTO MATCH VALUES
('M01','T1', 'T2', 2, 0);
INSERT INTO MATCH VALUES
('M02','T1', 'T2', 1, 1);
INSERT INTO MATCH VALUES
('M03','T1', 'T2', 0, 2);
INSERT INTO MATCH VALUES
('M04','T1', 'T2', 0, 2);
INSERT INTO MATCH VALUES
('M05','T2', 'T1', 2, 0);
INSERT INTO MATCH VALUES
('M06','T2', 'T1', 0, 2);
INSERT INTO MATCH VALUES
('M07','T2', 'T1', 1, 2);
INSERT INTO MATCH VALUES
('M08','T2', 'T1', 0, 2);
一時テーブル (結果が保存される場所):
DROP TABLE RESULTS;
CREATE GLOBAL TEMPORARY TABLE RESULTS
(ht_id varchar2 (5),
FINAL NUMBER (2))
ON COMMIT PRESERVE ROWS;
insert into RESULTS values('T1', NULL);
insert into RESULTS values('T2', NULL);
insert into RESULTS values('T3', NULL);
insert into RESULTS values('T4', NULL);
insert into RESULTS values('T5', NULL);
適用したクエリ:
select
sum(case when HT_ID='T1' then P_F else 0 end) +
sum(case when AT_ID='T1' then P_A else 0 end)
from match;
9 の結果を返します。select クエリを関数に適用し、その関数を呼び出して結果を一時テーブルに格納する手順を作成しました。ただし、関数で行われた合計の結果は別々になります (たとえば、T1 の場合は 6、T2 の場合は 3 ですが、T1 だけの場合は 9 ポイントになるはずです)。
HT_ID FINAL
----- ----------
T1 3
T2 6
T3 0
T4 0
T5 0
クエリと同じ結果を保持して一時テーブルに入力するにはどうすればよいですか? 以下のように:
HT_ID FINAL
----- ----------
T1 9
T2 0
T3 0
T4 0
T5 0
これは、機能と手順に関して私が試したものです:
drop function RESULTSFINAL;
CREATE OR REPLACE FUNCTION RESULTSFINAL(i_HT_ID RESULTS.HT_ID%TYPE)
RETURN VARCHAR2
IS
v_RESULTS_FINAL RESULTS.FINAL%TYPE;
BEGIN
select sum(case when HT_ID='T1' then P_F else 0 end)+ sum(case when AT_ID='T1' then P_A else 0 end)
INTO v_RESULTS_FINAL
FROM MATCH
WHERE HT_ID = i_HT_ID;
IF v_RESULTS_FINAL IS NULL THEN
v_RESULTS_FINAL := 0;
END IF;
RETURN v_RESULTS_FINAL;
END;
/
手順:
CREATE OR REPLACE PROCEDURE FINALSCORES
AS
CURSOR c_RESULTS
IS
SELECT HT_ID
FROM RESULTS;
v_HT_ID RESULTS.HT_ID%TYPE;
v_RESULTS_FINAL RESULTS.FINAL%TYPE;
BEGIN
OPEN c_RESULTS;
LOOP
FETCH c_RESULTS INTO v_HT_ID;
EXIT WHEN c_RESULTS%NOTFOUND;
v_RESULTS_FINAL := RESULTSFINAL(v_HT_ID);
UPDATE RESULTS
SET FINAL = v_RESULTS_FINAL
WHERE HT_ID = v_HT_ID;
END LOOP;
CLOSE c_RESULTS;
END;
/
FINALSCORES を実行します。
前もって感謝します。