создание курсора для подсчета - PullRequest
0 голосов
/ 16 мая 2018

У меня есть эта процедура:

    create or replace procedure check_max_game_rule_test (i_player_id IN NUMBER,i_max_games IN NUMBER, i_err_code OUT number)
is
  v_fixid number;
  v_count_fixid number;
  max_games_violation exception;

  cursor c1 is 
  SELECT ti.fixid,count(ti.fixid)
   FROM   BUS_SESSION BS,
                      CASINO_USERS CUP,                  
                      TICKET_ITEMS TI
               WHERE  BS.PARTY_ID =  4356
               AND    TI.BUS_SESSION_SESSION_ID = BS.SESSION_ID
               AND    NVL(BS.SESSION_CLOSE,'N') = 'N'
               and    CUP.parent_id = BS.AFF_ID
               AND    BS.SESSION_TYPE = 'TICKET SESSION'
    group by      TI.FIXID;    
    r1 c1%ROWTYPE;    
    begin
    open c1;
    loop 
    fetch c1 into v_fixid,v_count_fixid;
         if v_count_fixid > i_max_games
         then 
         raise max_games_violation;
 end if;
     end loop;
     close c1;
   end ;

результаты, которые выбирают, возвращают: enter image description here

Процедура должна посчитать тот же фиксид и сравнить его с i_max_games иесли счет этого фиксированного значения больше, чем i_max_games, тогда выдается исключение ..

Теперь я сталкиваюсь с символом c1

Может ли кто-нибудь помочь мне в этом, и является ли этот курсор для получения и сравнения фиксированного логического значения?

1 Ответ

0 голосов
/ 16 мая 2018

Вам не нужен цикл CURSOR для этого.используйте единственное исключение для выбора и повышения на основе общего количества.Также используйте ANSI JOIN s.

create or replace procedure check_max_game_rule_test (i_player_id in number, 
                                                      i_max_games in number, 
                                                      i_err_code  out number) 
is 
  v_count_fixid number; 
  max_games_violation exception; 
begin 
    select count(*) 
      into   v_count_fixid 
      from ( 
           select 1 FROM bus_session bs 
           join casino_users cup 
             on cup.parent_id = bs.aff_id 
           join ticket_items ti 
             on ti.bus_session_session_id = bs.session_id 
    where  bs.party_id = 4356 
           and nvl(bs.session_close, 'N') = 'N' 
           and bs.session_type = 'TICKET SESSION' 
    group  by ti.fixid 
    having count(ti.fixid) > i_max_games ); 

    if v_count_fixid > 0 then 
      raise max_games_violation; 
    end if; 
end; 
/
...