方法名称 execute 此语句不声明 OUT 参数。使用 { ?= call ... } 声明一个

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

我已将数据库从 Oracle 迁移到 AWS Aurora PostgreSQL。我看到所有的包都被迁移为 PostgreSQL 中的函数。我使用 AWS SCT 将 Oracle 模式转换为 postgreSQL。 Java为应用中间件

例如, Oracle pk_audit.sp_get_audit 中的一个包和关联的存储过程转换为带有 $ 符号的 postgreSQL pk_audit$sp_get_audit

当我 运行 Web 应用程序时,我收到类似 method Name execute This statement does not declare an OUT parameter 的错误。使用 { ?= call ... } 声明 one

我无权访问该应用程序,但应用程序团队提供了 weblogic 日志。它说,

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

Java代码中指定的包名是pk_audit.sp_get_audit 将 Postgres 函数 pk_audit$sp_get_audit 重命名为 pk_audit.sp_get_audit 仍然面临问题。

我需要在 PostgreSQL DB 中做些什么吗? 我需要建议和帮助,谢谢。

CallableStatement 中所述,调用存储过程的 JDBC 语法就是其中之一

{call ProcedureName(?, ...)}

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

任何参数都可以是OUT参数。 return值当然是一种OUT参数。

因此,如果您有一个带有 2 个参数的存储过程并且第二个参数是一个 OUT 参数,您可以将其编码为:

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

如果将相同的过程转换为函数,您可以将其编码为:

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

如果无法更改 Java 进行调用的代码,则需要将函数转换回过程。