代码之家  ›  专栏  ›  技术社区  ›  civesuas_sine

oracle函数未返回正确的值

  •  1
  • civesuas_sine  · 技术社区  · 6 年前

    我有一个函数,select中的数据需要与IF中的条件进行比较,如果select中有一行,那么它将返回ret_val=0。

    但如果有两行或更多行,其中一行满足条件,而另一行不满足条件,那么它仍然不返回0,而是返回rec_tkt_sess.cash_out。

    有人能告诉为什么光标在返回0时没有这些数据吗?

    好像光标没有穿过所有行。。。

    enter image description here

    CREATE OR REPLACE FUNCTION cash_out_ticket_cond(party_id   IN casino_users.party_id%TYPE ,session_id IN bus_session.session_id%TYPE    
    
        ) RETURN NUMBER AS ret_val NUMBER; 
    
        P_EXCHANGE_BET_CREDITS COUNTRY.EXCHANGE_BET_CREDITS%type;
        P_EXCHANGE_VALUE    COUNTRY.EXCHANGE_VALUE%type;
    
    
    CURSOR cur_tkt_sess (party_id IN casino_users.party_id%TYPE,session_id IN .bus_session.session_id%TYPE)
            IS
            SELECT bs.session_id 
                    ,tii.status 
                    ,ROW_NUMBER() OVER (PARTITION BY bs.session_id ORDER BY status ASC)  rn 
                    ,NVL(TO_CHAR(bs.started, 'DD.MM.YYYY HH24:MI'), 'Live')  started 
                    ,bs.bet  bet 
                    ,tii.time_p 
                    ,tii.live_prematch 
                    ,cash_out(bet)  cash_out 
                FROM bus_session bs 
                    ,ticket_items tii 
            WHERE bs.session_id             = tii.bus_session_session_id 
                AND bs.session_type         = 'TICKET SESSION' 
                AND bs.party_id             = cur_tkt_sess.party_id 
                AND bs.session_id           = cur_tkt_sess.session_id 
                AND NVL(bs.session_close, 'N') = 'N';           
        rec_tkt_sess cur_tkt_sess%ROWTYPE; 
    
        BEGIN       
            CHAGE_CREDITS (party_id, P_EXCHANGE_BET_CREDITS, P_EXCHANGE_VALUE);     
        OPEN cur_tkt_sess(cash_out_ticket_cond.party_id, cash_out_ticket_cond.session_id); 
                FETCH cur_tkt_sess 
        INTO rec_tkt_sess; 
    
        IF(cur_tkt_sess%FOUND) THEN         
            IF( 
                (TO_DATE(rec_tkt_sess.started,'DD.MM.YYYY HH24:MI:SS') +1 <=SYSDATE)  -- is ticket older then 24 hours
                OR 
                (rec_tkt_sess.live_prematch != '0')  --is it live  (1 live , 0 not live)
                OR 
                (rec_tkt_sess.time_p <SYSDATE)  -- is game begin
                )
                THEN 
                    ret_val := 0;
                ELSE 
                ret_val := rec_tkt_sess.cash_out;           
            END IF; 
    
        ELSE    
            ret_val := -1; 
        END IF; 
    
        RETURN(ret_val); 
    
        END cash_out_ticket_cond;
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Stilgar    6 年前

    您只提取一行,没有ORDERBY子句,您不知道将提取两个示例行中的哪一行。添加ORDER BY之后,循环查看结果,直到达到所需的条件:

    OPEN cur_tkt_sess;
    LOOP
        FETCH cur_tkt_sess INTO rec_tkt_sess;
        EXIT WHEN cur_tkt_sess%NOTFOUND;
        --[ Check some stuff, Do some stuff ]--
    END LOOP
    CLOSE cur_tkt_sess