"select for update is just like UPDATE - it is just like update. "
It is in Oracle because Oracle maintains its locks on the record itself rather than maintaining a separate list of 'locked records'.
"it is not 'sensible' to think that closing a cursor would release locks...."
To expand on this, you generally use SELECT...FOR UPDATE with the idea you may actually update the record. You want to hold that lock until you update or decide not to update.
The database can never know when you (or your program) may make that decision to not update, so it has to keep the lock until you tell it to release locks.
Closing the cursor isn't sufficient to tell it to release locks.
Firstly a record could actually have been locked for update by several cursors within your session, so you'd have to record each locked record by cursor, not just session. Very large, and unmanagable, lock list.
Secondly, expanding Tom's list, we could have
dbms_sql.open cursor
dbms_sql.parse (a statement )
dbms_sql.bind (optional)
dbms_sql.execute( that statement )
dbms_sql.fetch (optional repeated)
dbms_sql.bind (optional)
dbms_sql.execute( that statement )
dbms_sql.fetch (optional repeated)
dbms_sql.close
where we execute the same cursor twice, probably for different rowsets. You then have to decide when the locked records are released at the subsequent execute or at the final close. You could even argue for releasing them after a subsequent fetch as that is the last point at which they can be updated with the WHERE CURRENT OF syntax.
Thirdly, you may update some, but not all, of the records selected for update. Those actually updated now need an additional entry in your record of locks.
Finally, you could have used an implicit cursor which is immediately closed (or implicitly left open for reuse at the whim of the database).
Also worth pointing out that, under Oracle, if session A finds a record locked by session B, it then waits for session B's TRANSACTION to commit/rollback, rather than waiting for the record to be unlocked, so even a ROLLBACK to SAVEPOINT that releases those locks wouldn't free session A. So not only are you looking at a different locking mechanism, but also a different waiting mechanism.