In both cases the transaction will fail, causing the record to be lost...
Everybody knows that when a transaction fails, you restart it from the beginning. You don't just drop your change on the floor. That would be silly.
...your suggestion includes using non-sql checking...
So you're imagining that we can put the entire update in one big blob of SQL and run it without checking for any error messages? That seems... optimistic. But at least we can agree that using a perl-based cache "to speed things up" is a Bad Idea, right?
committing the transaction is not only redundant, it will slow down the entire operation, and removes the ability of rollback of more than one record.
So correct me if I'm wrong, but if you hold too many row locks on a table, doesn't Oracle automatically upgrade it to a table lock? And isn't holding a table lock for the duration of the import operation potentially disruptive to a busy database? Maybe we need more context than the OP has provided.
in Oracle, there is MERGE ("upsert") statement, which does exactly what the op wants to do.
I thought Oracle might have added such a feature, but I didn't know what it was called. Thanks for pointing this out.