计算每场比赛的百分比

时间:2018-04-25 11:21:53

标签: oracle plsql database-cursor

我需要计算百分比并从每场比赛中累积它。我必须参数p_percentage,这将是变量,参数p_top也是可变的,他的任务是当p_top满足然后做某事(更新或插入)。我在这里迷路了。循环或获取v_percentage是否更好。我做得对吗? 感谢

    CREATE OR REPLACE FUNCTION "jackpot" 
     (p_percentage number
     ,p_top number,
     p_player number,
     p_party_id number
     )
     RETURN NUMBER
    declare           
        Cursor c1 is                                                
            select p_percentage/game_in *100 into v_percentage from game
            where player_id = p_player ;
            rw c1%rowtype;
        v_top number;
        v_percentage number;
        BEGIN 
            open c1;
                 FOR i IN c1                        
                 while v_percentage <= p_top
                     LOOP                               
                     v_percentage:=v_percentage+v_percentage;       
                     end loop; 
                --update something
close c1;
            return v_percentage;
        END;
    end;
  

修改

create or replace PROCEDURE super_six_jackpot (
      i_party_id          IN       NUMBER,
      i_jackpot_limit      IN       NUMBER,
      i_jackpot_perc       IN       NUMBER,
      o_pot_size           OUT      NUMBER
   )
   IS
      p_username              VARCHAR2(100);
      p_party_id              number;
      pot_perc                NUMBER;
      pot_size                NUMBER;
      parent_aff              NUMBER;
      ret_pot_size            NUMBER;
      pom                     weak_cur;
   BEGIN
        SELECT  c.party_id, p.aff_id
        into p_party_id, parent_aff
        FROM   casino_users c,pot_by_aff p
       WHERE   c.parent_id = p.aff_id
         AND   c.parent_id = :i_party_id;


        SELECT total
                        INTO   pot_perc
              FROM   (
                SELECT SUM( i_jackpot_perc/game_in * 100 ) OVER ( ORDER BY ROWNUM ) AS total
                FROM   game_record
                WHERE  party_id = p_party_id
                ORDER BY total DESC
              )
              WHERE total <= i_jackpot_limit
              AND   ROWNUM = 1;
                         EXECUTE IMMEDIATE 'UPDATE pot_by_aff
                                 SET bingo_jackpot_size = NVL (total, 0) 
                             WHERE aff_id = :parent_aff
                         RETURNING pot_size
                             INTO :ret_pot_size'
                     USING     parent_aff,
                           OUT ret_pot_size;      
         BEGIN
            OPEN pom FOR 'SELECT bingo_jackpot_size
                            FROM pot_by_aff
                           WHERE aff_id = :parent_aff' 
                           USING parent_aff;
            FETCH pom
             INTO ret_pot_size;
            CLOSE pom;
         END;
      o_pot_size      := ret_pot_size;

      END super_six_jackpot;

2 个答案:

答案 0 :(得分:1)

您只需要知道玩家的总百分比是达到还是超过顶部?为此,您可以在单个SQL语句中使用SUM函数,无需循环。我不知道game_in来自哪里,为什么你会在SELECT中使用p_percentage,但这可能会有所帮助:

CREATE OR REPLACE PROCEDURE give_jackpot (p_percentage    NUMBER,
                                          p_top           NUMBER,
                                          p_player        NUMBER,
                                          p_party_id      NUMBER)
IS
   l_total   NUMBER;
BEGIN
   SELECT SUM (p_percentage / game_in * 100)
     INTO l_total
     FROM game
    WHERE player_id = p_player;

   IF l_total >= p_top
   THEN
      /* insert or update here */
      NULL;
   END IF;
END;

答案 1 :(得分:0)

  • 使用分析函数获取SQL查询中的累计总数。
  • 您没有使用intent://www.xxxxx.com/home#Intent;scheme=xxxx;package=xxxxx.android.app;end指定程序。
  • 如果您不需要,请不要使用双引号标识符。
  • 您无法在游标中使用DECLARE

像这样:

SELECT ... INTO