But assuming you needed to do this using PL/SQL you should do the update using ROWID rather than a table column. You should also modify the cursor query so it does NOT use a function on the table column. Unless you have a functional index on 'settle_due_dt' use of the TRUNC function will prevent any normal index from being used.

And if you only have 1.5 million rows in the table how can you possibly need to update 1 million of them every day?

1. Modify your CURSOR to fetch the ROWID of the rows that need to be updated.
>
CURSOR s_cur IS
SELECT DT.ROWID rid
FROM deposit_tbl dt
WHERE DT.STATUS_VALUE = l_awaiting_status
AND dt.settle_due_dt >= trunc(SYSDATE) AND dt.settle_due_dt <= SYSDATE; -- NOTE: no TRUNC on the table column
>

2. Modify your TYPE to be the ROWID of the cursor result

TYPE fetch_array IS TABLE OF s_cur.rid%TYPE;
3. Modify the UPDATE query to use ROWID (the cursor rid column) to do the update. ROWID is the fastest way to find the row again.

WHERE ROWID = s_array (i);

You should also be using a FOR UPDATE clause to lock the rows that you intend to update.