Estou com um problema e sinceramente não tenho mais ideia do que fazer, é o seguinte:
Tenho um bloco muito simples, onde abro um cursor e apresento as informações utilizando "dbms_output.put_line".
Quando executo meu bloco utilizando meus parâmetros "cravados" na query, o tempo de execução é de 10 a 15 segundos em média, mas quando passo um parâmetro para a query o tempo de execução sobre para 2 minutos e meio.
Sei que o plano de execução muda quando executo das duas maneiras, mas tanto assim? Achei bem estranho.
Os tipos de dados entre campo e parâmetros estão corretos, já avaliei muita coisa e não encontrei nada, será que conseguem me dar uma luz?!
Abaixo estou escrevendo os dois códigos, lento e rápido.
Trecho com parâmetro cravado (81):
and (
(81 = -9998 and rdnf.org_id in (81,106,107))
or (81 = -9999)
or (81 > 0 and 81 = rdnf.org_id)
)
and (
(p_org_id = -9998 and rdnf.org_id in (81,106,107))
or (p_org_id = -9999)
or (p_org_id > 0 and p_org_id = rdnf.org_id)
)
declare
p_org_id ap.ap_invoices_all.org_id%type;
cursor c1 is
select rdnf.org_id
,fnc_org_nome(rdnf.org_id) nome_org_id
,rdnf.cod_dependência
,apps.fnc_gl_descricao(3, rdnf.cod_dependência) nome_dependência
,rdnf.cod_subdependencia
,apps.fnc_gl_descricao(4, rdnf.cod_subdependencia) nome_subdependencia
,rdnf.cod_conta
, apps.fnc_gl_descricao(5, rdnf.cod_conta) nome_conta
,pgto.cod_cnpj_cpf
,pgto.nom_fornecedor
,pgto.dt_pagto
,pgto.num_nf
, pgto.vlr_bruto
,pgto.num_parcela
,sum(round((pgto.vlr_previsto * perc_rateio),4)) vlr_previsto
,pgto.dt_vencimento
,pgto.dt_gl
,pgto.num_pagto
,pgto.nom_lote
,sum(round((pgto.vlr_desconto * perc_rateio),4)) vlr_desconto
,sum(round((pgto.vlr_juros * perc_rateio),4)) vlr_juros
,sum(round((pgto.vlr_ret_contratual * perc_rateio),4)) vlr_ret_contratual
,sum(round((pgto.vlr_ret_impostos_ri * perc_rateio),4)) vlr_ret_impostos_ri
,sum(round((pgto.vlr_ret_impostos_ap * perc_rateio),4)) vlr_ret_impostos_ap
,sum(round((pgto.vlr_pago * perc_rateio),4) ) vlr_pago_s_juros
,pgto.tp_origem
,pgto.tp_nota
,pgto.tp_fornecedor
,pgto.num_ordem
, sum(round(round((nvl(pgto.vlr_juros,0) * perc_rateio),2) + round((pgto.vlr_pago * perc_rateio),2),2)) vlr_pago
from
xxce_rateio_dep_nf rdnf,
( select aiv.org_id, aiv.invoice_id,
( decode(assa.global_attribute9,
'1', substr(assa.global_attribute10,1,3)||'.' ||substr(assa.global_attribute10,4,3)||'.'||substr(assa.global_attribute10,7,3) || '-' || assa.global_attribute12,
'2', substr(assa.global_attribute10,2,2)||'.' ||substr(assa.global_attribute10,4,3)||'.'||substr(assa.global_attribute10,7,3)--|| '/' ||
)) cod_cnpj_cpf,
acv.vendor_name nom_fornecedor,
to_char(to_date(acv.check_date, 'DD/MM/YYYY'),'DD/MM/YY') dt_pagto,
aiv.invoice_num num_nf,
aiv.invoice_amount vlr_bruto ,
apsa.payment_num num_parcela,
nvl(apsa.gross_amount,0) vlr_previsto,
to_date(apsa.due_date,'DD/MM/YYYY') dt_vencimento,
to_date(aipv.accounting_date,'DD/MM/YYYY') dt_gl,
acv.check_number num_pagto,
acv.checkrun_name nom_lote,
nvl(aipv.discount_taken,0) vlr_desconto,
nvl((select (nvl(iaj.invoice_amount,0))
from ap_invoice_payments_all aipj, ap_invoices_all iaj,
ap_invoice_relationships air, ap_checks_all acj
where air.original_payment_num = aipv.payment_num
and air.original_invoice_id = aipv.invoice_id
and air.related_invoice_id = iaj.invoice_id
and iaj.org_id = aipv.org_id
and iaj.invoice_id = aipj.invoice_id
and aipj.check_id = acj.check_id
and acj.status_lookup_code <> 'VOIDED'
and iaj.invoice_type_lookup_code = 'INTEREST'
),0) vlr_juros,
nvl(aiv.validated_tax_amount,0) vlr_ret_contratual,
nvl( ( select sum(abs(nvl(apl.amount,0))) from ap_invoice_distributions_all apl
where apl.invoice_id = aiv.invoice_id and
apl.line_type_lookup_code ='MISCELLANEOUS' and nvl(reversal_flag,'N') = 'N' ),0) vlr_ret_impostos_ri,
nvl( ( select sum(abs(nvl(apl.amount,0))) from ap_invoice_distributions_all apl
where apl.awt_invoice_payment_id = aipv.invoice_payment_id and apl.line_type_lookup_code ='AWT'
and nvl(reversal_flag,'N') = 'N' ),0) vlr_ret_impostos_ap,
nvl(aipv.amount,0) vlr_pago,
aiv.source tp_origem,
( select meaning
from fnd_lookup_values_vl
where lookup_type = 'INVOICE TYPE'
and lookup_code = aiv.invoice_type_lookup_code) tp_nota,
nvl(assa.global_attribute15, 'NÃO INFORMADO') tp_fornecedor,
decode(assa.global_attribute15,'AUTORIDADE FISCAL',2,1) num_ordem
from ap.ap_invoices_all aiv,
ap_invoice_payments_all aipv,
ap_checks_all acv,
ap_payment_schedules_all apsa,
ap_supplier_sites_all assa
where aiv.invoice_id = aipv.invoice_id
and aiv.org_id = assa.org_id
and aiv.vendor_id = assa.vendor_id
and aiv.vendor_site_id = assa.vendor_site_id
and aipv.check_id = acv.check_id
and apsa.invoice_id = aiv.invoice_id
and apsa.payment_num = aipv.payment_num
and acv.status_lookup_code <> 'VOIDED'
and acv.bank_account_name not like '%VIRTUAL%'
and (
(81 = -9998 and aiv.org_id in (81,106,107))
or (81 = -9999)
or (81 > 0 and 81 = aiv.org_id)
)
and acv.check_date between to_date('05/02/13','DD/MM/YY') and to_date('05/02/13','DD/MM/YY')
and aiv.invoice_id = 331392
)
pgto
where pgto.invoice_id = rdnf.invoice_id_ap
and pgto.org_id = rdnf.org_id
and pgto.tp_nota <> 'Juros'
and (
(81 = -9998 and rdnf.org_id in (81,106,107))
or (81 = -9999)
or (81 > 0 and 81 = rdnf.org_id)
)
group by
rdnf.org_id
,rdnf.cod_conta
,rdnf.cod_subdependencia
,rdnf.cod_dependência
,pgto.dt_pagto
,apps.fnc_gl_descricao(5, rdnf.cod_conta)
,pgto.cod_cnpj_cpf
,pgto.nom_fornecedor
,pgto.num_nf
,pgto.num_parcela
,pgto.dt_vencimento
,pgto.dt_gl
,pgto.num_pagto
,pgto.nom_lote
,pgto.tp_origem
,pgto.tp_nota
,pgto.tp_fornecedor
,pgto.num_ordem
,pgto.vlr_bruto
order by
rdnf.org_id
,rdnf.cod_dependência
;
begin
p_org_id :=81;
for c2 in c1 loop
dbms_output.put_line(c2.cod_conta);
dbms_output.put_line(c2.cod_dependência);
dbms_output.put_line(c2.dt_pagto);
dbms_output.put_line(c2.nom_fornecedor);
dbms_output.put_line(c2.vlr_bruto);
dbms_output.put_line(' ');
end loop;
end;