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

标签 java oracle postgresql weblogic amazon-aurora

我已将数据库从 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/

相关文章:

java - 如何将CSS文件加载到jsp中

java - 任何人都可以向我解释一下这个自动装箱吗?

oracle - Liquibase - 在一个文件中上传多个 Oracle 触发器

java.sql.SQLException : ORA-00933: SQL command not properly ended Error with LIKE Sql Query

postgresql - 排序时 postgres 忽略 "-"

bash - 通过 readreg 和粘贴将输入发送到分离的 'screen' 时出现问题

postgresql - 为什么在创建 GIN 索引时出错?

java - 在命令对象中绑定(bind)集合时出错

java - Android:无法发送http post

Javafx自定义单元工厂节点不起作用,但继承了单元工厂中的setText()方法