Blöde Frage, aber kannst du den Optimze mal weglassen ?

Wenn du das Statement preparest, killst du das auch ggf. vorher mit "Drop Statement" ?
Bist du sicher dass der Cursor auch tatsächlich geschlossen ist (nicht der ODP) ?

Kannst du die wechselnden OrderBy's mal mittels STRSQL testen ?

Dynamische SQL's sind meist dann problematisch, wenn mit den Ressourcen etwas schludrig umgegangen wird.