Kleiner Tipp am Rande:
Wenn du das SQL Statement öfters aufrufst (vielleicht sogar innerhalb einer Schleife) solltest du lieber einen Cursor verwenden. Auch wenn du nur einen Satz lesen willst.
Dadurch bleibt ab dem 2ten mal lesen, der ODP vorhanden und muss nicht neu erstellt werden.

Du könntest es mit einem Select count(*) Into :v1 ... prüfen.
Wobei das nicht das eigentliche Problem löst.
Wenn du nur 1 Satz haben willst, musst du feststellen, welche Kriterien zutreffen müssen (WHERE-Klausel). Wenn hin und wieder doch mehrere Sätze vorkommen, dann sind die Kriterien nicht ausreichend und du musst das Konzept neu überdenken.

Lass ein Monitor für diese Abfrage eingegränzt laufen. Dann siehst du bei welchen Kriterien mehrere Sätze gefunden werden.

lg Andreas