Insert z klauzulą with w procedurze, mało danych

0

Cześć,

Stworzyłem poniższa procedurę, pojawił się problem z liczbą danych które generuje.

Insert odpalany bez procedury zwraca ponad 15000 rekordów. Kiedy odpalę procedurę, liczba generowanych danych to tylko 120 rekordów. Parametry nadaje takie same, jak puszczam procedure oraz odpalam insert "ręcznie". Czym to może być spowodowane?

create or replace procedure calc_p (p_startdate NUMBER, p_end_date NUMBER, p_id NUMBER) is

BEGIN

DBMS_OUTPUT.PUT_LINE('Start: '||SUBSTR(localtimestamp,1,17));

    delete from rep_pd where b_id = p_id and rep_date between p_startdate and  p_end_date;

COMMIT; 

insert into rep_pd 

 with cont(rep_date, b_id, con_number, okres_zap) as (
    select /*+ materialize*/ rep_date, b_id, con_number, nvl(maturity_date - origin_date, 0) AS okres_zap 
            from con@sg_al where description not in ('OVER', 'Overn' )
            and b_id = p_id
            AND rep_date BETWEEN p_startdate AND p_end_date
            )

 SELECT mr.suffix1, mr.data_danych, ma.rep_date, b_id, mr.k_symbol, konto_nazwa,
        CASE
        WHEN mr.k_nazwa LIKE '%EXT%' THEN '04'
        WHEN mr.k_symbol LIKE '3731%' then '12'
        ELSE mr.typ_k_symbol END AS cl_t,
        ma.okres_zap, mr.rezydent_symbol, mr.w_symbol as cu,
        mr.sal_ma_pl as outstanding, get_pd_account(k_symbol) AS depo
        substr(TO_NUMBER(TO_CHAR(data_danych, 'yyyymmdd')),7,2) as dzien
        from abc.a_mr mr
            left join cont ma
            on ma.b_id = p_id
            and to_date(ma.rep_date,'YY/MM/DD') = mr.data_danych
            and ma.con_number = mr.suffix1
        where sal_ma_pl <> 0
        and get_pd_account(k_symbol) is not null 
        and nvl(typ_k_symbol,'20') not in ('01','02','02A')
        and  mr.data_danych BETWEEN TO_DATE(p_startdate,'YY/MM/DD') AND TO_DATE(p_end_date,'YY/MM/DD');

commit;

DBMS_OUTPUT.PUT_LINE('Koniec: '||SUBSTR(localtimestamp,1,17));

end calc_p;
0

Jak sprawdzasz te ilości?

0

Sprawdzam liczbę danych na tabeli wynikowej po przeliczeniu procesu uwzględniając parametry podane w procedurze.

0
  1. Na pewno te same warunki? Ten sam użytkownik, ten sam schemat bazodanowy?
  2. Odpalasz ręcznie "INSERTA" i robisz commita, tak jak w procedurze, czy odpalasz samo zapytanie?
  3. Może są jakieś triggery na rep_pd ?
0

Czy przypadkiem ponowne odpalenie nie mnoży ci rekordy wykładniczo?

0

@yarel:

  1. Na pewno te same warunki i ten sam użytkownik i schemat.
  2. Zmieniłem p_id, odpalam ręcznie inserta, dostaję informacje '37 503 rows inserted.', wcześniej robiłem rollback, teraz zrobiłem commit i w tabeli mam zamiast 37 503, jest tylko 676 wierszy. Także tutaj jest jakiś problem.
  3. Tabela jest "czysta" bez triggerów, constraintów, partycji itp.
0

Pokaż tego inserta z uzupełnionymi parametrami oraz to jak wywołujesz procedurę. Konkretne wartości.

Podejrzanie wyglądają parametry wejściowe procedury: (p_startdate NUMBER, p_end_date NUMBER, , które są typu NUMBER.

oraz
a) AND rep_date BETWEEN p_startdate AND p_end_date
b) Jakaś dziwna konwersja:

  and  mr.data_danych BETWEEN TO_DATE(p_startdate,'YY/MM/DD') AND TO_DATE(p_end_date,'YY/MM/DD');
  • Jakiego typu jest mr.data_danych ?
  • Jakiego typu jest rep_date ?
0

Przykładowo p_startdate = 20190830 p_end_date = 20190831

mr.data_danych to DATE, a rep_date to NUMBER

0

Wyłuskaj samego select'a i zobacz ile daje rekordów przy bezpośrednim odpaleniu a ile jeżeli wsadzisz w widok a ile jeżeli wsadzisz w procedurę.
Sądzę że wyniki cię naprowadzą, a jak nie to śmiało wklejaj tu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1