当前位置: 首页 > 知识库问答 >
问题:

我可以使用postgres JDBC驱动程序从java调用postgres“过程”(而不是“函数”)吗?

符畅
2023-03-14

我是Postgres11的新手,但正在尝试调用Postgres11中的过程(新的“过程”而不是“函数”),从java作为spring SimpleJDBCCall进行调用(使用PostgresQL-42.2.5jdbc驱动程序)。但是,当我执行该过程时,遇到以下异常:

org.springframework.jdbc.badsqlgrammarexception:CallableStatementCallback;错误的SQL语法[{call pa_test_schema.pr_doSomething(?)}];嵌套异常为org.postgresql.util.psqlexception:error: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)在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);    

当我逐步完成代码时,我可以看到驱动程序正在将可调用语句的sql修改为调用postgres函数所需的语法:

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

共有1个答案

通宾白
2023-03-14

目前(从Postgres11.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的call命令。不要将此与CallableStatement“{call...}”语法混淆。

有关CallableStatement当前无法工作的原因的更多细节,可以在JDBC邮件列表中找到

 类似资料:
  • 我是postgres新手,但我正在尝试调用postgres 11中的过程(新的“过程”不是“函数”),以spring SimpleJDBCall(使用Postgresql-42.2.5 jdbc驱动程序)的形式从java调用。然而,当我执行该过程时,我遇到以下异常: (?)}]; BadSqlGrammarException: CallableStatementCallback;坏SQL语法[{调

  • 问题内容: 我正在寻找使用Docker和Kubernetes时通过边车自动设置MongoDb副本集的过程。 以上的设置是不是非常重要的 ,它归结为是,我需要能够调用蒙戈副本集命令(例如,,,,等)从一个Node.js应用程式。 注意:它不一定来自节点应用程序,如果有人知道完成同一件事的另一种方法,请分享您的想法。 更新: 我能够使此工作正常进行,并已将sidecar开源供其他人使用。 https:

  • 问题内容: 介绍 我听说过一些有关用Java编写设备驱动程序的信息(听说是“用我的耳朵”,而不是通过互联网),我想知道…我一直认为设备驱动程序在操作系统级别上运行,因此必须以相同的语言编写作为操作系统(因此大多是CI假设) 问题 我通常会对此假设有误吗?(看起来是这样) OS中如何使用“外来”语言的驱动程序? 无论如何(从编程语言的角度)对设备驱动程序有什么要求? 谢谢阅读 问题答案: 有两种方法

  • 问题内容: 从Mongodb客户端,我们可以使用db.Collection.stats()来获取集合状态,例如: +记录数(计数) +磁盘 大小(storageSize) +索引(indexSizes) +平均对象大小(avgObjSize) 现在,我想使用Mongodb Java驱动程序从Web后端监视这些数据,请让我知道如何获取它们? 我已经提到:http : //mongodb.github

  • 从Mongodb客户端,我们可以使用db.collection.stats()获取集合的状态,例如: +记录数(count) +磁盘上的大小(storageSize) +索引(indexsize) +平均对象大小(avgObjSize) 现在我想用Mongodb java驱动程序从web后端监控这些数据,请让我知道如何获取它们? 我提到了:http://mongodb.github.io/mong

  • 问题内容: 这与另一个用户先前提出的问题有关,该问题询问如何在EclipseIDE中检测代码是否正在运行。 我注意到Eclipse总是使用而不是来启动程序。(这并不意味着启动的程序是从Eclipse启动的)。 我可以找到使用传递的参数 但这并不能告诉我它是使用还是启动的。 有没有办法找出它是使用还是启动的? 为什么Eclipse用于启动程序? 问题答案: System.console()将返回,因