method Name execute This statement does not declare an OUT parameter. Use { ?= call ... } to declare one

aan anna philip :

I had migrated database from Oracle to AWS Aurora PostgreSQL. I saw that all the packages are migrated as Function in PostgreSQL. I used AWS SCT for the Oracle schema conversion to postgreSQL. Java is the application middleware.

for example, A package and associated stored proc in Oracle pk_audit.sp_get_audit converted to postgreSQL as pk_audit$sp_get_audit with a $ symbol.

When I run the web application, I'm getting an error like method Name execute This statement does not declare an OUT parameter. Use { ?= call ... } to declare one .

I don't have access to the application, but App team provided weblogic log. It says,

Method Name execute org.postgresql.util.PSQLException: This statement does not declare an OUT parameter.Use { ?= call ... } to declare one. org.postgresql.jdbc.PgCallableStatement.registerOutParameter(PgCallableStatement.java:205) weblogic.jdbc.wrapper.CallableStatement_org_postgresql_jdbc_PgCallableStatement.registerOutParameter(Unknown Source

package name specified in the Java code is pk_audit.sp_get_audit Renamed the Postgres function pk_audit$sp_get_audit to pk_audit.sp_get_audit still facing the issue.

Is there anything I need to do in PostgreSQL DB ? I need advise and help,Thanks.

Andreas :

As documented in CallableStatement, the JDBC syntax for calling stored procedures is one of these

{call ProcedureName(?, ...)}

{? = call FunctionName(?, ...)}

Any of the parameters can be OUT parameters. The return value is of course a type of OUT parameter.

So, if you had a stored procedure with 2 parameters and the second parameter was an OUT parameter, you would code it as:

String sql = "{call MyProcedure(?, ?)}";
try (CallableStatement stmt = conn.prepareCall(sql)) {
    stmt.setInt(1, p1);
    stmt.registerOutParameter(2, Types.VARCHAR);
    ...
}

If that same procedure is converted into a function, you would code it as:

String sql = "{? = call MyFunction(?)}";
try (CallableStatement stmt = conn.prepareCall(sql)) {
    stmt.registerOutParameter(1, Types.VARCHAR);
    stmt.setInt(2, p1);
    ...
}

If you cannot change the Java code making the call, you need to convert your functions back to procedures.

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=389203&siteId=1