计算每场比赛的百分比

Calcute percentage of every game in

我需要计算百分比并从每场比赛中累积它。我必须参数 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;

EDIT

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;

您是否只需要知道玩家的总百分比是否达到或超过顶部?为此,您可以在单个 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;
  • 使用解析函数获取 SQL 查询中的累计总数。
  • 您没有使用 DECLARE 指定程序。
  • 如无必要,请不要使用双引号标识符。
  • 您不能在游标内使用 SELECT ... INTO

像这样:

CREATE OR REPLACE FUNCTION jackpot (
  p_percentage number,
  p_top        number,
  p_player     number,
  p_party_id   number
) RETURN NUMBER
IS
   v_percentage number;
BEGIN
  SELECT total
  INTO   v_percentage
  FROM   (
    SELECT SUM( p_percentage/game_in *100 ) OVER ( ORDER BY ROWNUM ) AS total
    FROM   game
    WHERE  player_id = p_player
    ORDER BY total DESC
  )
  WHERE total <= p_top
  AND   ROWNUM = 1;

  --update something
  RETURN v_percentage;
END;
/