A partir de la entrada anterior sobre CallableStatement, he estado jugueteando, con PostgreSQL 12. Y ¿cómo no? problemas
Resulta que usando la sintaxis especial de CallableStatement, llamada JDBC scape syntax, no me funcionaba la llamada a procedimientos desde Java. Es decir, esto
connection.prepareCall("{call insert_data(?,?,?)}")
no me funcionaba, daba error de que insert_data es un procedure y que hay que usar «call». Mientras que esta
connection.prepareCall("{? = call add(?,?)}")
si funcionaba sin problemas. Así que tras mucho darle vueltas y googlear, me encuentro que lo de que el driver Java de postgreSQL haga caso a este tipo de sintaxis o no, depende de una variable escapeSyntaxCallMode, que puede tener tres valores
public enum EscapeSyntaxCallMode { SELECT("select"), CALL_IF_NO_RETURN("callIfNoReturn"), CALL("call");
Por defecto y compatibilidad hacia atrás está en SELECT, que NO funciona para las llamadas a PROCEDURES con CallableStatement. Hay que cambiarlo para su correcto funcionamiento a callIfNoReturn.
Así que la URL de conexión desde Java a través del driver quedaría así
"jdbc:postgresql://localhost/chuidiang-examples?escapeSyntaxCallMode=callIfNoReturn"
o bien usando las properties de conexión.
Todo facilidades.