I generally use PL/SQL collections for this. Essentially you create a table type, then create a variable with that table type, then do a select for update to get all of the data that you want to update, then do a forall update to update the data. Since you are updating the a table the record type should be that table. Such as:
TYPE sku_tab_type IS TABLE OF sku@bn2%ROWTYPE
INDEX BY PLS_INTEGER;
sku_table sku_tab_type;
Then do a select for update and a forall update a commit and you are done. If you needed to you could probably load the data with a limit clause in a loop so that you could process a small chunk of data at a time. I would start by trying to update all of the data at once.
http://www.oracle.com/technetwork/issue-archive/2012/12-sep/o52plsql-1709862.html
Here is my best guess on two indexes that could help the performance. You probably need to test with and without these indexes, or maybe you already have indexes that do enough.
CREATE INDEX gm_prc_reg_prc_items_idx1 ON gm_prc_reg_prc_items_idx1
( storecode, listprice, sellprice, stylecode );
CREATE INDEX sku_IDX@bn2 ON sku@bn2
( prev_perm_ret, ret_prc, itm_cd );