Check out
http://asktom.oracle.com/pls/ask/f?p...37336448016847

A more complex alternative would be to use DBMS_SQL to
1) PARSE the query
2) DESCRIBE the result set
3) DEFINE_COLUMN according to the results from (2)
4) Loop round with FETCH_ROWS for each row returned (in this case there should be 1 as you are using a primary key)
4a) Loop round with COLUMN_VALUE for each column in the row