Имя метода execute Этот оператор не объявляет параметр OUT. Используйте {? = Call ...}, чтобы объявить один - PullRequest
0 голосов
/ 02 апреля 2020

Я перенес базу данных с Oracle на AWS Аврора PostgreSQL. Я видел, что все пакеты перенесены как функция в PostgreSQL. Я использовал AWS SCT для преобразования схемы Oracle в postgreSQL. Java - это промежуточное ПО приложения.

, например, Пакет и связанный с ним сохраненный pro c в Oracle pk_audit.sp_get_audit, преобразованный в postgreSQL как pk_audit$sp_get_audit с $ symbol.

Когда я запускаю веб-приложение, я получаю сообщение об ошибке, подобное method Name execute Этот оператор не объявляет параметр OUT. Используйте {? = Call ...}, чтобы объявить один .

У меня нет доступа к приложению, но команда приложения предоставила журнал c журнала. В нем говорится, что

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? Мне нужен совет и помощь, спасибо.

1 Ответ

0 голосов
/ 02 апреля 2020

Как указано в CallableStatement, синтаксис JDB C для вызова хранимых процедур является одним из этих

{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, выполняющий вызов, вам необходимо преобразовать свои функции обратно в процедуры .

...