If you want to program in PL/SQL,
you should read
the documentation. If you still have problems, come back here to ask specific questions. For handling cursors, see chapter 6 - Static SQL. (I've given link to most recent documentation, if you have a different version of Oracle, find corresponding documentation.)
Cursors are the standard way to handle data in PL/SQL, they cannot be avoided, and are used even by
JDBC to retrieve data from the database. Thus the recommendation to not use them does not make sense. (The only way to avoid cursors is to manipulate data using SQL - see the next point).
However, you should reconsider whether the thing you want to program in PL/SQL is not doable using plain SQL. Oracle can efficiently execute even very complicated SQL statements with lots of joined tables, and it will always be much more performant than any PL/SQL construct. Even merging some of the four selects together and eg. processing two instead of four would be benefical. "Loops of loops" type of operation sounds like an operation that would be very good candidate to be performed in SQL. Complicated updates of joined tables are also possible.
If you do it in PL/SQL and are not on 11g, definitely use bulk collect - a kind of batching. In 11g, this optimization si done automatically behind the scenes.
And finally, if you do need PL/SQL, consider using stored procedure (or better - package). Anonymous blocks get compiled anew with every execution, while stored procedures are compiled once (upon creation) and then reused.
Edit: It should be possible to return an array from PL/SQL using collections. You might also create a function that returns a ref cursor. I'd suggest you to consider using pure SQL first, then you won't have to research into returning collections from PL/SQL block. It should definitely be doable, but I don't have any particular experience with it.