java调用postgreSQL企业版函数时CallableStatement失败

java CallableStatement failed, while calling function of postgreSQL enterprise edition

病历:

我已经将 postgreSQL 普通版升级到企业版

旧版本: x86_64-pc-linux-gnu 上的 PostgreSQL 9.5.5,由 gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-55) 编译,64 位

新版本: x86_64-pc-linux-gnu 上的 EnterpriseDB 9.5.0.5,由 gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-55) 编译,64 位

从旧版本中完全转储并导入到新版本中。

问题陈述:

虽然我们正在从新版本 (Enterprise) 访问 postgre 函数(通过从 java 1.8 建立连接)。尽管与 postgreSQL enterprise 建立连接没有问题,但出现以下错误。

org.postgresql.util.PSQLException: A CallableStatement was executed with an invalid number of parameters
        at org.postgresql.jdbc.PgCallableStatement.executeWithFlags(PgCallableStatement.java:106)

所有 144 个函数都会出现此错误。 java callableStatement 和 prepared statement 在使用 enterprise PostgreSQL 时有什么变化吗?尽管在与旧版本的 PostgreSQL 建立连接时,相同的程序仍在运行。

请推荐

BR// 莫希特 M

对我来说 CallableStatementPreparedStatement 有效。 我在

之前使用 CallableStatement 使用以下代码
CallableStatement objCallableStatement = null;
objCallableStatement = connection.prepareCall("{call alad_balad(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}");

objCallableStatement.setLong(1, 431);
objCallableStatement.setString(2, "12434");
objCallableStatement.setString(3, "1234");
objCallableStatement.setString(4, "en");
objCallableStatement.setString(5, null); 
objCallableStatement.setString(6, null);
objCallableStatement.setShort(7, Short.parseShort("0"));
objCallableStatement.setString(8, null);
objCallableStatement.setLong(9, 1);
objCallableStatement.setString(10, "1234");
objCallableStatement.registerOutParameter(11, java.sql.Types.VARCHAR);
objCallableStatement.registerOutParameter(12, java.sql.Types.VARCHAR);
objCallableStatement.registerOutParameter(13, java.sql.Types.VARCHAR);
objCallableStatement.registerOutParameter(14, java.sql.Types.BIGINT);
objCallableStatement.registerOutParameter(15, java.sql.Types.OTHER);
objCallableStatement.registerOutParameter(16, java.sql.Types.OTHER);
objCallableStatement.execute();

现在企业版我使用下面的代码

PreparedStatement objPreparedStatement = null;
try{
objConnection = objConnectionDataSource.getConnection();
objPreparedStatement = objConnection.prepareCall("{call alad_balad(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}");

objPreparedStatement.setLong(1, 431);
objPreparedStatement.setString(2, "12434");
objPreparedStatement.setString(3, "1234");
objPreparedStatement.setString(4, "en");
objPreparedStatement.setString(5, null); 
objPreparedStatement.setString(6, null);
objPreparedStatement.setShort(7, Short.parseShort("0"));
objPreparedStatement.setString(8, null);
objPreparedStatement.setLong(9, 1);
objPreparedStatement.setString(10, "1234");

objPreparedStatement.execute();
   ResultSet res = objPreparedStatement.getResultSet();
   String in = null;
   while ( res.next() ){
     in = res.getString(1);
     System.out.println(in);
   }

我也遇到了同样的问题

我认为您使用的是 postgresql-9.4.1211.jre6.jar。问题将通过将 jar 替换为 postgresql-9.4.1209.jre6.jar 来解决。