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

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

姜宏放
2023-03-14

我是postgres新手,但我正在尝试调用postgres 11中的过程(新的“过程”不是“函数”),以spring SimpleJDBCall(使用Postgresql-42.2.5 jdbc驱动程序)的形式从java调用。然而,当我执行该过程时,我遇到以下异常:

(?)}]; BadSqlGrammarException: CallableStatementCallback;坏SQL语法[{调用_dosomethingemplate.java:1065emplate.execute嵌套异常是_dosomethingPSQLException: ERROR:emplate.callorg.springframework.jdbc.core.(bigint)是一个过程提示:要调用一个过程,使用CALL。位置:15在emplate.java:1104SQLStateSQLExceptionTorg.springframework.jdbc.core.simple.翻译(SQLStateSQLExceptionTall.execute)在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.translate异常(JdbcTemplate.java:1402)在org.springframework.jdbc.core.JdbcTorg.springframework.jdbc.(JdbcTpa_test_schema.pr)在org.postgresql.util.JdbcTpa_test_schema.pr(JdbcTorg.springframework.jdbc.support.)在ranslator.doAbstractJdbcCranslator.java:101Call内部

我的程序代码:

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函数所需的语法:

从pa\U test\U架构中选择*。pr\u剂量(?)因此

这是驱动程序中执行此转换的方法:https://github.com/pgjdbc/pgjdbc/blob/faab499853c56f67cb70fb242f75b918452f2a6f/pgjdbc/src/main/java/org/postgresql/core/Parser.java#L766

据我所知,过程只在Postgres 11中引入(以前会使用无效返回函数),并且已经阅读了postgres驱动程序留档,但没有看到任何调用过程而不是函数的参考。

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

共有1个答案

赵驰
2023-03-14

目前(从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的call命令。不要将其与{调用…}混淆 可调用语句的语法。

有关当前CallableStatement不起作用的原因的更多详细信息,请参见此处和此处的JDBC邮件列表

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

  • 问题内容: 我正在寻找使用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()将返回,因