This is my Query...

procedure pr_create_payment_invoice (
ip_batch_load_id in number,
ip_file_id in number
) is
c_unit_name varchar2(30):='pr_create_payment_invoice';

l_counter NUMBER := 0;
l_insert_count NUMBER := 0;

TYPE t_invoice_id IS TABLE OF pk_fin_data_source.t_invoice;
l_invoice_id t_invoice_id;

CURSOR cr_get_invoice_id(cp_batch_load_id in number) IS
SELECT /*+ use_hash(invoice) */
DISTINCT sfpi.invoice_id invoice_id
,invoice.customer_account_invoice_str invoice_no
,sfpi.payment_id
,NULL
BULK COLLECT INTO l_invoice_id
FROM stage_fin_payment sfp
,stage_fin_payment_invoice sfpi
,(SELECT /*+ no_merge */
invoice_id
,customer_account_invoice_str
FROM stage_fin_invoice sfi
WHERE batch_load_id = cp_batch_load_id
GROUP BY invoice_id
,customer_account_invoice_str) invoice
WHERE sfp.to_account_id = sfpi.account_id
AND sfp.payment_id = sfpi.payment_id
AND sfp.from_account_id IS NULL
AND sfp.batch_load_id = sfpi.batch_load_id
AND sfp.batch_load_id = cp_batch_load_id
AND EXISTS
(SELECT 1
FROM invoice_col ic
WHERE sfpi.invoice_id = ic.invoice_id)
AND sfpi.invoice_id = invoice.invoice_id(+);

begin

pk_globals.pr_add_call(GC_PACKAGE_NAME||'.'||c_unit_name);

OPEN cr_get_invoice_id(ip_batch_load_id);

LOOP
FETCH cr_get_invoice_id BULK COLLECT INTO l_invoice_id LIMIT GC_COMMIT_SIZE;

l_counter := l_invoice_id.COUNT;
l_insert_count := l_insert_count + l_counter;

--
FORALL l_invoiceid IN 1..l_counter
insert into tallyman_interface_line (
file_id,
line_type,
sequence_no,
batch_load_id,
interface_line_1,
interface_line_2,
record_created_timestamp
) select
ip_file_id,
2,
tallyman_line_no_seq.nextval,
ip_batch_load_id,
customer_account_invoice_str --CR 75539
||'|'||current_due
||'|'||case when (payment_date + grace_period_days > payment_extract_time)
then 0 else 1 end
||'|'||null
,
null,
sysdate
from stage_fin_invoice,
stage_control
where batch_load_id = ip_batch_load_id
and invoice_id = l_invoice_id.invoice_id(l_invoiceid);

COMMIT;

EXIT WHEN cr_get_invoice_id%NOTFOUND;

END LOOP;

CLOSE cr_get_invoice_id;