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:
DECLARE my_cursor AS SELECT * FROM foo ;
Then you execute another query to begin fetching results from the cursor, for example:
FETCH ALL FROM my_cursor;
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.