JDBC exécute la procédure stockée SQL Server avec la valeur de return et les parameters d'input / sortie

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:

  • Utilisation d'instructions avec des procédures stockées
  • Utilisation d'une procédure stockée avec un état de return
  • Utilisation d'une procédure stockée avec des parameters de sortie

En outre, pour les procédures stockées sans aucun argument, cela ressemblerait à …

 this.connection.prepareCall("{call dbo.storedProcedure()}")