0

ケース履歴:

postgreSQL を通常の Enterprise エディションにアップグレードしました

古いバージョン: gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-55) でコンパイルされた x86_64-pc-linux-gnu 上の PostgreSQL 9.5.5、64 ビット

新バージョン: x86_64-pc-linux-gnu 上の EnterpriseDB 9.5.0.5、gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-55) でコンパイル、64 ビット

古いバージョンから完全なダンプを取得し、新しいバージョンにインポートしました。

問題文:

私たちは新しいバージョン(エンタープライズ)からpostgre機能にアクセスしています(Java 1.8から接続することによって)。postgreSQL エンタープライズとの接続の確立に問題はありませんが、エラーを下回っています。

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

このエラーは、144 個の関数すべてで発生します。エンタープライズ PostgreSQL を使用しているときに、java callableStatement と Prepared Statement に変更はありますか? 古いバージョンの PostgreSQL との接続を確立している間、同じ手順が機能していますが。

提案してください

BR//モヒットM

4

2 に答える 2

0

CallableStatementではなく、私にとって はPreparedStatementうまくいきました。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);
   }
于 2016-12-12T08:16:54.703 に答える