Re: CallableStatement.getParameterMetaData() throws exception for valid {call ...} statement - Mailing list pgsql-jdbc
| From | dmp |
|---|---|
| Subject | Re: CallableStatement.getParameterMetaData() throws exception for valid {call ...} statement |
| Date | |
| Msg-id | 556A1477.2050506@ttc-cmc.net Whole thread Raw |
| In response to | CallableStatement.getParameterMetaData() throws exception for valid {call ...} statement (Thomas Kellerer <spam_eater@gmx.net>) |
| Responses |
Re: CallableStatement.getParameterMetaData() throws exception for
valid {call ...} statement
|
| List | pgsql-jdbc |
Thomas Kellerer wrote:
> Hello,
>
> I just noticed the following:
>
> Using this sample function from the manual:
>
> CREATE FUNCTION sum_n_product(x int, y int, OUT sum int, OUT prod int) AS $$
> BEGIN
> sum := x + y;
> prod := x * y;
> END;
> $$ LANGUAGE plpgsql;
>
>
> When calling this through JDBC, the following works without problems:
>
> cstmt = connection.prepareCall("{call sum_n_product(?,?,?,?)}");
> cstmt.registerOutParameter(3, Types.INTEGER);
> cstmt.registerOutParameter(4, Types.INTEGER);
> cstmt.setInt(1, 2);
> cstmt.setInt(2, 5);
> cstmt.execute();
> int x1 = cstmt.getInt(3);
> int x2 = cstmt.getInt(4);
>
> System.out.println("x1: " + x1);
> System.out.println("x2: " + x2);
>
> However when calling
>
> ParameterMetaData meta = cstmt.getParameterMetaData();
>
> after prepareCall() the following exception is thrown:
>
> org.postgresql.util.PSQLException: ERROR: function sum_n_product(unknown,
> unknown, unknown, unknown) does not exist
> Hint: No function matches the given name and argument types. You might
> need to add explicit type casts.
> Position: 15
>
> Casting everything to integer ( "{call
> sum_n_product(?::int,?::int,?::int,?::int)}" ) produces the same error (except
> that the parameter list shows integer in the exception message).
>
> This looks like a bug to me. Why should getParameterMetaData() throw an
> exception if the call is valid and working?
>
> Driver version is 9.4-1200
> Postgres version is 9.4.2
> Java version is 1.7.0_55
>
> Regards
> Thomas
Hello,
Seems to work fine, maybe I have it wrong?
danap.
private void testCallableStatement2(Connection connection)
{
// Method Instances
String sqlStatementString;
Statement sqlStatement;
CallableStatement cstmt;
ParameterMetaData meta;
try
{
// Setup a connection statement.
sqlStatement = connection.createStatement();
// Create Function.
//sqlStatementString = "DROP FUNCTION sum_n_product(int, int, OUT int,
OUT int)";
//sqlStatement.execute(sqlStatementString);
sqlStatementString = "CREATE OR REPLACE FUNCTION sum_n_product(x int,
y int, OUT sum int, OUT prod int) AS $$"
+ " SELECT (x + y) AS sum, (x * y) AS prod; $$ LANGUAGE SQL;";
System.out.println(sqlStatementString);
sqlStatement.execute(sqlStatementString);
// Execute Function.
cstmt = connection.prepareCall("{call sum_n_product(?,?,?,?)}");
cstmt.registerOutParameter(3, Types.INTEGER);
cstmt.registerOutParameter(4, Types.INTEGER);
cstmt.setInt(1, 2);
cstmt.setInt(2, 5);
cstmt.execute();
meta = cstmt.getParameterMetaData();
System.out.println("Parameter Count: " + meta.getParameterCount());
int x1 = cstmt.getInt(3);
int x2 = cstmt.getInt(4);
System.out.println("x1: " + x1);
System.out.println("x2: " + x2);
// Drop Function.
sqlStatementString = "DROP FUNCTION sum_n_product(int, int, OUT int,
OUT int);";
System.out.println(sqlStatementString);
sqlStatement.execute(sqlStatementString);
cstmt.close();
sqlStatement.close();
}
catch (SQLException sqle)
{
System.out.println("SQL Exeception" + sqle);
}
}
pgsql-jdbc by date: