MEMBER FUNCTION getBalance(Acc NUMBER, Obj NUMBER DEFAULT NULL, bDt DATE DEFAULT NULL, eDt DATE DEFAULT NULL, rw NUMBER DEFAULT NULL) RETURN NUMBER IS num NUMBER; row NUMBER := NVL(rw, SELF.transID); bDate DATE; eDate DATE; BEGIN bDate := NVL(bDt,SYSDATE - 365*200); eDate := NVL(eDt,SYSDATE); --+index(money_dist XIF3MONEY_DIST) по CLIENT_ID IF Obj IS NULL THEN IF row IS NOT NULL THEN SELECT SUM(trans_sum) INTO num FROM (SELECT /*+index(money_dist XIF3MONEY_DIST)*/ trans_sum FROM money_dist WHERE client_id = clientID AND debet = Acc AND log_id <= row UNION ALL SELECT /*+index(money_dist XIF3MONEY_DIST)*/ -trans_sum FROM money_dist WHERE client_id = clientID AND credit = Acc AND log_id <= row); ELSE SELECT SUM(trans_sum) INTO num FROM (SELECT /*+index(money_dist XIF3MONEY_DIST)*/ trans_sum FROM money_dist WHERE client_id = clientID AND debet = Acc AND trans_date BETWEEN bDate AND eDate UNION ALL SELECT /*+index(money_dist XIF3MONEY_DIST)*/ -trans_sum FROM money_dist WHERE client_id = clientID AND credit = Acc AND trans_date BETWEEN bDate AND eDate); END IF; ELSE IF row IS NOT NULL THEN SELECT SUM(trans_sum) INTO num FROM (SELECT /*+index(money_dist XIF3MONEY_DIST)*/ trans_sum FROM money_dist WHERE client_id = clientID AND debet = Acc AND debet_id = Obj AND log_id <= row UNION ALL SELECT /*+index(money_dist XIF3MONEY_DIST)*/ -trans_sum FROM money_dist WHERE client_id = clientID AND credit = Acc AND credit_id = Obj AND log_id <= row); ELSE SELECT SUM(trans_sum) INTO num FROM (SELECT /*+index(money_dist XIF3MONEY_DIST)*/ trans_sum FROM money_dist WHERE client_id = clientID AND debet = Acc AND debet_id = Obj AND trans_date BETWEEN bDate AND eDate UNION ALL SELECT /*+index(money_dist XIF3MONEY_DIST)*/ -trans_sum FROM money_dist WHERE client_id = clientID AND credit = Acc AND credit_id = Obj AND trans_date BETWEEN bDate AND eDate); END IF; END IF; RETURN ROUND(NVL(num,0),2); END;