0

プロシージャによって呼び出される関数で 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 を実行します。

前もって感謝します。

4

2 に答える 2

1
select 
  sum(case when HT_ID=i_HT_ID then P_F else 0 end)
  + sum(case when AT_ID=i_HT_ID then P_A else 0 end)
INTO v_RESULTS_FINAL
FROM MATCH;
于 2013-04-25T17:48:42.800 に答える
1

次のように DECODE を使用して同じことを実行することもできます。

CREATE OR REPLACE FUNCTION RESULTSFINAL(i_HT_ID RESULTS.HT_ID%TYPE)
 RETURN VARCHAR2
IS

    v_RESULTS_FINAL  RESULTS.FINAL%TYPE;
BEGIN

      select sum(decode(HT_ID,i_HT_ID,P_F,
                              decode(AT_ID,i_HT_ID,P_A,0)))
                into v_RESULTS_FINAL
      from match;

      IF v_RESULTS_FINAL IS NULL THEN
          v_RESULTS_FINAL := 0;
      END IF;

      RETURN v_RESULTS_FINAL;
END;
/
于 2013-04-25T18:33:22.907 に答える