У меня ошибка ORA-32040 (рекурсивное предложение WITH должно использовать операцию UNION ALL) в моей процедуре. Я понятия не имею, как переписать эту вставку, чтобы объединить все.
У вас есть какие-либо предложения?
Я должен использовать with
, потому что обе таблицы contract и an_mr содержат очень большой объем данных.
create or replace procedure calc_p (p_startdate NUMBER, p_end_date NUMBER, p_b_id NUMBER) is
BEGIN
delete from rep_p where bank_id = p_b_id and rep_date between p_startdate and p_end_date;
COMMIT;
insert into rep_p
with contract (suffix1, data_d, rep_date, bank_id, account_symbol, account_desc, cli_type, currency, depozyt, dz) as (
select /*+ materialize*/ rep_date, bank_id, con_number, nvl(maturity_date - origin_date, 0) AS ok_zap
from contract@sb_am where description not in ('OVERNIGHT', 'O/N' )
and bank_id = p_b_id
AND rep_date BETWEEN p_startdate AND p_end_date
)
SELECT mr.suffix1, mr.data_d, ma.rep_date, bank_id, mr.account_symbol, account_desc,
CASE
WHEN mr.account_desc LIKE '%MIE%' THEN '04'
WHEN mr.account_symbol LIKE '3731%' then '12'
ELSE mr.cli_type END AS cli_type,
ma.ok_zap, mr.rez_symbol, mr.waluta_symbol as currency,
mr.saldo_ma_pln as outstanding, get_pd_account(account_symbol) AS depozyt,
substr(TO_NUMBER(TO_CHAR(data_d, 'yyyymmdd')),7,2) as dz
from wh_ods.an_mr mr
left join contract ma
on ma.bank_id = p_b_id
and to_date(ma.rep_date) = mr.data_d
and ma.con_number = mr.suffix1
where saldo_ma_pln <> 0
and get_pd_account(account_symbol) is not null
and nvl(cli_type,'20') not in ('01','02','02A')
and mr.data_d BETWEEN TO_DATE(p_startdate,'YYYYMMDD') AND TO_DATE(p_end_date,'YYYYMMDD');
end calc_p;