我已将数据库从 Oracle 迁移到 AWS Aurora PostgreSQL。我看到所有的包都作为 PostgreSQL 中的函数迁移。我使用 AWS SCT 将 Oracle 架构转换为 postgreSQL。 Java是应用程序中间件。
例如,
Oracle pk_audit.sp_get_audit
中的包和关联存储过程转换为 postgreSQL,作为带有 $
符号的 pk_audit$sp_get_audit
。
当我运行 Web 应用程序时,收到类似方法名称执行此语句未声明 OUT 参数的错误。使用 { ?= call ... } 声明一个。
我无权访问该应用程序,但应用程序团队提供了 weblogic 日志。它说,
方法名称执行org.postgresql.util.PSQLException:
该语句不声明 OUT 参数。使用 { ?= call ... } 声明一个。
org.postgresql.jdbc.PgCallableStatement.registerOutParameter(PgCallableStatement.java:205) weblogic.jdbc.wrapper.CallableStatement_org_postgresql_jdbc_PgCallableStatement.registerOutParameter(未知来源
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 参数。返回值当然是一种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 代码,则需要将函数转换回过程。
关于java - 方法名称execute 该语句不声明OUT 参数。使用 { ?= call ... } 声明一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60986076/