Stored procedures 我可以叫博士后吗;程序“;(不是“函数”)使用postgres JDBC驱动程序从java获取?

Stored procedures 我可以叫博士后吗;程序“;(不是“函数”)使用postgres JDBC驱动程序从java获取?,stored-procedures,jdbc,spring-jdbc,postgresql-11,Stored Procedures,Jdbc,Spring Jdbc,Postgresql 11,我不熟悉postgres,但我尝试在postgres 11中调用一个过程(新的“过程”而不是“函数”),从java作为spring SimpleJDCCall调用(使用Postgresql-42.2.5 jdbc驱动程序)。但是,当我执行该过程时,我遇到以下异常: org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback;错误的SQL语法[{调用 p_测试模式。pr_dosomething(?)};嵌套异

我不熟悉postgres,但我尝试在postgres 11中调用一个过程(新的“过程”而不是“函数”),从java作为spring SimpleJDCCall调用(使用Postgresql-42.2.5 jdbc驱动程序)。但是,当我执行该过程时,我遇到以下异常:

org.springframework.jdbc.BadSqlGrammarException: CallableStatementCallback;错误的SQL语法[{调用 p_测试模式。pr_dosomething(?)};嵌套异常是 org.postgresql.util.PSQLException:错误: pa_test_schema.pr_dosomething(bigint)是一个过程提示:调用 程序,使用CALL。职位:15 org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:101) 在 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) 在 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 在 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 在 org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1402) 在 org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1065) 在 org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1104) 在 org.springframework.jdbc.core.simple.AbstractJdbcCall.ExecuteCallineral(AbstractJdbcCall.java:414) 在 org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:397) 在 org.springframework.jdbc.core.simple.SimpleJdbcCall.execute(SimpleJdbcCall.java:193)

我的程序代码:

CREATE PROCEDURE pa_test_schema.pr_DoSomething
( P_input_ID IN inputs.input_ID%TYPE
) AS $$
BEGIN
    -- do something   
END; 
$$ LANGUAGE plpgsql;
我的java代码:

SimpleJdbcCallOperations pr_DoSomething =  new SimpleJdbcCall(jdbcTemplate)
        .withSchemaName("pa_test_schema")
        .withProcedureName("pr_DoSomething");
Map<String, Object> inputs = Maps.newHashMap();
inputs.put("p_input_id", 123456);

pr_DoSomething.execute(inputs);    
SimpleJDBCAllOperations pr_DoSomething=新的SimpleJdbcCall(jdbcTemplate)
.使用方案名称(“方案测试方案”)
.使用程序重命名(“pr_DoSomething”);
Map inputs=Maps.newHashMap();
输入。输入(“p_输入_id”,123456);
pr_DoSomething.execute(输入);
当我逐步浏览代码时,我可以看到驱动程序正在将callable语句的sql修改为调用postgres函数所需的语法:

从pa_测试模式中选择*作为结果

这是驱动程序中执行此转换的方法:

我知道程序只是在Postgres 11中介绍的(以前可能会使用无效返回函数),并且已经阅读了Postgres驱动程序文档,但没有看到调用程序而不是函数的任何参考

这是否意味着当前的postgres驱动程序还不支持这一点,或者我应该使用另一种方法?我应该改用postgres函数吗?

目前(从postgres 11.1和驱动程序版本42.2.5开始),使用
CallableStatement
的标准JDBC方法不能用于调用存储过程

我并没有真正使用Spring JDBC模板,但以下代码在普通JDBC中工作,应该适用于Spring JDBC Tempalte:

Connection con = DriverManager.getConnection(...);
PreparedStatement pstmt = con.prepareStatement("call pa_test_schema.pr_DoSomething(?)");
pstmt.setInt(1, 42);
pstmt.execute();
注意,这使用Postgres的命令。不要将其与
CallableStatement
“{call…}”语法混淆


在JDBC邮件列表和