J'ai une procédure stockée qui prend 1 valeur d'input, 2 parameters de sortie et renvoie également une valeur sur l'exécution
Sur Internet, j'ai vu des references en utilisant Call
CallableStatement cstmt = conn.prepareCall("{call ? = spName(?, ?, ?)}"); cstmt.registerOutParameter(1, Types.INTEGER); cstmt.setObject(2, Types.INTEGER); cstmt.registerOutParameter(3, Types.NVARCHAR); cstmt.registerOutParameter(4, Types.NVARCHAR);
Mais cela me donne l'erreur
"Incorrect syntax near '{'"
Ensuite, j'ai décidé de faire comme le code SQL généré par SQL Management Studio:
CallableStatement cstmt = conn.prepareCall("exec ? = spName ?, ?, ?"); cstmt.registerOutParameter(1, Types.INTEGER); cstmt.setObject(2, Types.INTEGER); cstmt.registerOutParameter(3, Types.NVARCHAR); cstmt.registerOutParameter(4, Types.NVARCHAR);
Mais cela me donne l'erreur
"Incorrect syntax near '='"
Je pense que c'est parce que la requête est transformée en
"exec @P1 OUT = spName @P2, @P3 OUT, @P4 OUT"
et cela ne fonctionne pas non plus sur SQL Management Studio car 'OUT' s'affiche avant '='
Et cela me laisse sans idées parce que ça ne marche pas de toute façon.
Aucune suggestion?
Je vous remercie!
La syntaxe pour appeler une procédure stockée est:
{[?=]call procedure-name[([parameter][,[parameter]]...)]}
Votre premier exemple triggers donc une exception dans l'parsingur de l'appel JDBC car vous avez placé call
avant la valeur de return. Je ne suis pas sûr du problème avec le second.
Donc, je m'attendrais à ce que cela fonctionne si vous modifiez votre premier exemple pour:
CallableStatement cstmt = conn.prepareCall("{?=call spName(?, ?, ?)}");
Vous pouvez find plus d'informations spécifiquement pour le pilote Microsoft JDBC sur MSDN:
En outre, pour les procédures stockées sans aucun argument, cela ressemblerait à …
this.connection.prepareCall("{call dbo.storedProcedure()}")