The only time I have seen this error was wheh calling bind_columns() before the execute() method. I don't quite understand your SQL because I am more of a Postgres man myself. Perhaps, someone with Oracle expetience can give a better advice.
In Postgres you first declare your cursor which doesn't return any results - it's just a $dbh->do call which either succeedes or fails:
in reply to Re^5: Query takes 895ms in TOAD but 42s in DBI
in thread Query takes 895ms in TOAD but 42s in DBI
Then you execute another query to begin fetching results from the cursor, for example:
DECLARE my_cursor AS SELECT * FROM foo ;
And it's here where I will use bind_coulumns() and fetch(). So, basically, the sql has to return rows for the bind_columns() call to work. What I don't understand is how does your original code work if the sql doesn't return any rows? Or perhaps it does but not immediately.
FETCH ALL FROM my_cursor;