Рассчитать процент каждой игры в - PullRequest
0 голосов
/ 25 апреля 2018

Мне нужно вычислять процент и накапливать его из каждой игры. Мне нужно, чтобы параметры 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;

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018
  • Используйте аналитическую функцию, чтобы получить совокупную сумму в запросе 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;
/
0 голосов
/ 25 апреля 2018

Вам просто нужно знать, достигает ли или нет общий процент игрока до вершины? Для этого вы можете использовать функцию SUM в одном операторе SQL, без цикла. Я не знаю, откуда взялся game_in и почему вы должны использовать p_percentage внутри SELECT, но, возможно, это поможет:

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;
...