J'ai des problèmes pour appeler une fonction Oracle (pas une procédure stockée) depuis Java 1.6, en utilisant ojdbc14.jar.
Je ne sais pas ce que contient la fonction car je l'appelle depuis un serveur distant, tout ce que je sais c'est ceci:
FUNCTION ap_ch_get_acct_balances (VAR_PI_MOB_NO_ACCT_NO VARCHAR2,
VAR_REPLY_CODE OUT NUMBER, VAR_EXT_RESPONSE OUT VARCHAR2, VAR_PO_ACC_BAL OUT CHAR,
VAR_PO_ACCT_NO OUT CHAR)
Le schéma que je dois utiliser est: FCRLIVE.AP_CH_GET_ACCT_BALANCES
J'essaye ceci:
String call = "{ ? = call FCRLIVE.AP_CH_GET_ACCT_BALANCES(?, ?, ?, ?, ?) }";
CallableStatement cstmt = conn.prepareCall(call);
cstmt.setQueryTimeout(1800);
cstmt.setString(1, inputCode);
cstmt.registerOutParameter(2, Oracle.jdbc.OracleTypes.NUMBER);
cstmt.registerOutParameter(3, Oracle.jdbc.OracleTypes.VARCHAR);
cstmt.registerOutParameter(4, Oracle.jdbc.OracleTypes.CHAR);
cstmt.registerOutParameter(5, Oracle.jdbc.OracleTypes.CHAR);
cstmt.executeUpdate();
Mais je continue de voir cela dans le fichier journal:
Java.sql.SQLException: ORA-01006: bind variable does not exist
at Oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.Java:134)
at Oracle.jdbc.ttc7.TTIoer.processError(TTIoer.Java:289)
at Oracle.jdbc.ttc7.Oall7.receive(Oall7.Java:573)
at Oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.Java:1891)
at Oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.Java:1093)
at Oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.Java:2047)
at Oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.Java:1940)
at Oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.Java:2688)
at Oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.Java:589)
Suis-je appeler la fonction mal? Ou qu'est-ce que cela pourrait être?
Merci d'avance pour l'aide!
ça devrait être:
String call = "{ ? = call FCRLIVE.AP_CH_GET_ACCT_BALANCES(?, ?, ?, ?, ?) }";
Vous devez définir le paramètre renvoyé par la fonction:
String call = "{ ? = call FCRLIVE.AP_CH_GET_ACCT_BALANCES(?, ?, ?, ?, ?) }";
CallableStatement cstmt = conn.prepareCall(call);
cstmt.setQueryTimeout(1800);
cstmt.registerOutParameter(1, ...Type returned by function);
cstmt.setString(2, inputCode);
cstmt.registerOutParameter(3, Oracle.jdbc.OracleTypes.NUMBER);
cstmt.registerOutParameter(4, Oracle.jdbc.OracleTypes.VARCHAR);
cstmt.registerOutParameter(5, Oracle.jdbc.OracleTypes.CHAR);
cstmt.registerOutParameter(6, Oracle.jdbc.OracleTypes.CHAR);
cstmt.executeUpdate();
votre paramètre de retour n'est qu'un. le premier. c'est le seul dont vous devez enregistrer le type. donc, première chose d'abord:
cstmt.registerOutParameter (1, Oracle.jdbc.OracleTypes.VARCHAR);
puis définissez/enregistrez les autres paramètres selon vos besoins, mais vous avez 6 paramètres comme dans les points d'interrogation et vous n'en gérez que 5. vous devrez également définir le 6ème:
cstmt.setString (6, myVariable);
si ce n'est pas clair, veuillez poster le prototype de la fonction sql que vous utilisez et je vous indiquerai la liaison manquante exacte.