The DBMS_SQL package allows for precise control over the fetch and processing of rows. The SQL can be completed programmatically and submitted for parsing. The key words here are ‘submitted for parsing’; you can force a hard parse upon any SQL using this package.
You can use this to share cursors as well. Maybe content for another article, but there is overhead in opening and closing cursors. Implicit cursors (where you just do a ‘select into’ perhaps) do the open/parse/fetch/close and if you are populating variables this way, you are causing a lot of CPU time for your apps.
Opening a cursor and using the DBMS_SQL.Parse command to process different SQL keeps these cursors open and avoids the costly overhead of quickly opening and closing dozens of cursors.