【问题标题】:PostgresQL stored procedure called from JDBC does not work从 JDBC 调用的 PostgreSQL 存储过程不起作用
【发布时间】:2016-06-20 05:46:15
【问题描述】:

我有一个 postgresql 数据库,其中包含一些表和一个在该表上写入的存储过程。一切都很好,当我从psql 调用这个存储过程时:我看到我的记录插入到我的表中。 虽然,当我通过 JDBC 调用这个存储过程时,我得到了存储过程执行的日志,序列增加了,但是我的表没有更新。

这是我从全新的 postgresql 安装 (9.5.1) 执行的 SQL:

表创建:

CREATE SEQUENCE atable_id_seq;
   CREATE TABLE IF NOT EXISTS "atable" (
   "id" int NOT NULL DEFAULT NEXTVAL('atable_id_seq'),
   "name" varchar(250) DEFAULT NULL,
   PRIMARY KEY ("id")
);

存储过程的创建:

CREATE OR REPLACE FUNCTION awrite(IN name character varying, OUT result character varying) AS
$$
BEGIN
            INSERT INTO atable(name) VALUES (name)
                    RETURNING atable.id INTO awrite.result;
                    RAISE INFO 'Create awrite: %', name;
END
$$
LANGUAGE plpgsql;

psql调用awrite存储过程实际上会触发postgres中的日志并更新表。

然后我写了一个java程序来调用同样的存储过程:

HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setDriverClassName("org.postgresql.Driver");
hikariConfig.setJdbcUrl("jdbc:postgresql://127.0.0.1:5432/toto?charSet=UNICODE");
hikariConfig.setUsername("toto");

hikariConfig.setAutoCommit(false);
hikariConfig.setMinimumIdle(0);
hikariConfig.setMaximumPoolSize(2);

JdbcTemplate jdbcTemplate =
        new JdbcTemplate(new HikariDataSource(hikariConfig));

SimpleJdbcCall call = new SimpleJdbcCall(jdbcTemplate).withProcedureName("awrite");

HashMap<String, Object> params = new HashMap<String, Object>();
params.put("name", "Foo");

call.addDeclaredParameter(new SqlOutParameter("result", Types.VARCHAR));

Map<String, Object> result = call.execute(params);
jdbcTemplate.execute("COMMIT;");

System.out.println("Result: ");
for (String s : result.keySet()) {
    System.out.println(s + ": " + result.get(s));
}

我得到了一个 ID,执行很顺利。但是我的表不包含记录。

我不明白,也许有人可以帮助我?

【问题讨论】:

    标签: postgresql stored-procedures jdbc spring-jdbc hikaricp


    【解决方案1】:

    我相信您的问题是您将 JDBC AutoCommit 标志设置为 false,但您没有使用 JDBC 事务。您需要在 JDBC 事务中运行调用(最简单的方法是将代码放入方法中并使用 @Transactional 注释该方法,或者使用 TransactionTemplate 以编程方式启动并提交 JDBC 事务)。像你一样调用“COMMIT”是行不通的。

    【讨论】:

      猜你喜欢
      • 2014-11-24
      • 2016-01-05
      • 2023-03-11
      • 2017-03-28
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多