Solange Connection-Pooling eingeschaltet ist, bleiben ODP's, die mehr als 1 mal verwendet wurden, offen bis die Verbindung über den Pool auch tatsächlich geschlossen wird.
ODP's haben mit geöffneten SQL-Cursorn nur indirekt was zu tun.
Beim 1. Open werden sie erstellt und beim 1. Close wieder geschlossen.
Beim 2. Open bleibt dieser bis zum echten Verbindungsclose dann offen.

Ein Close auf einer Connection schiebt diese nur in den Pool zurück, eine tatsächlicher Close erfolgt nicht.
Da hilft nur, ConnectionPooling (mit den entsprechenden Leistungseinbussen bei häufigem Open/Close) abzuschalten.