The database function does not use out parameters or a ref cursor, which was why I was confused. The Java sample I provided is a simplification of the built-in default logic of the Spring Batch ItemWriter - I put it into my own implementation class to help with debugging. The root cause seems to be the JDBC driver thinking that there should not be results because it is an update and the 'select' influencing that decision. I tried switching this ItemWriter implementation to use a CallableStatement, and that did work, but I wanted to understand why the approach I listed in the original post didn't work.
Thanks