J'avais base de données migrée d'Oracle vers PostgreSQL AWS Aurora. J'ai vu que tous les paquets sont migrés en tant que fonction dans PostgreSQL. Je AWS SCT pour la conversion de schéma Oracle à postgreSQL. Java est le middleware d'application.
par exemple, un emballage et proc stockée associée à Oracle pk_audit.sp_get_audit
convertis en postgreSQL comme pk_audit$sp_get_audit
un $
symbole.
Quand je lance l'application Web, je reçois une erreur comme méthode Nom exécuter cette instruction ne déclare pas un paramètre OUT. Utilisez {? = Appel ...} déclarer un .
Je n'ai pas accès à l'application, mais l'équipe App fourni journal weblogic. Ça dit,
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
Nom du package spécifié dans le code Java est pk_audit.sp_get_audit
Rebaptisé la fonction Postgres pk_audit$sp_get_audit
pour pk_audit.sp_get_audit
toujours face à la question.
Est-ce que je dois faire PostgreSQL DB? Je dois conseiller et aide, Merci.
Comme indiqué dans CallableStatement
la syntaxe JDBC pour appeler des procédures stockées est l' un de ces
{call ProcedureName(?, ...)}
{? = call FunctionName(?, ...)}
Tous les paramètres peuvent être des paramètres OUT. La valeur de retour est bien sûr un type de paramètre OUT.
Donc, si vous aviez une procédure stockée avec 2 paramètres et le second paramètre était un paramètre OUT, vous coder comme:
String sql = "{call MyProcedure(?, ?)}";
try (CallableStatement stmt = conn.prepareCall(sql)) {
stmt.setInt(1, p1);
stmt.registerOutParameter(2, Types.VARCHAR);
...
}
Si cette même procédure est convertie en une fonction, vous coderez comme:
String sql = "{? = call MyFunction(?)}";
try (CallableStatement stmt = conn.prepareCall(sql)) {
stmt.registerOutParameter(1, Types.VARCHAR);
stmt.setInt(2, p1);
...
}
Si vous ne pouvez pas modifier le code Java qui fait l'appel, vous devez convertir vos fonctions de retour aux procédures.