procédures stockées sous forme de requêtes: CallableStatement vs PreparedStatement
Documentation PostgreSQL recommande l'utilisation d'un CallableStatement
à appeler des procédures stockées.
Dans le cas d'une procédure stockée qui retourne un ensemble de lignes, quelles sont les différences entre l'utilisation de CallableStatement
:
String callString = "{ call rankFoos(?, ?) }";
CallableStatement callableStatement = con.prepareCall(callString);
callableStatement.setString(1, fooCategory);
callableStatement.setInt(2, minimumRank);
ResultSet results = statement.executeQuery();
Et à l'aide d'un régulier PreparedStatement
:
String queryString = "SELECT FooUID, Rank FROM rankFoos(?, ?);";
PreparedStatement preparedStatement = connection.prepareStatement(queryString);
preparedStatement.setString(1, fooCategory);
preparedStatement.setInt(2, minimumRank);
ResultSet results = statement.executeQuery();
Que je comprends, CallableStatement
offre un indépendant de la langue de l'appel de procédures stockées. Ce n'est pas grave pour moi si, car je sais que je suis en utilisant PostgreSQL. Aussi loin que je peux voir, l'avantage évident de l'utilisation de la PreparedStatement
est un plus polyvalent de la requête, le traitement de la procédure stockée comme une table, sur laquelle je peux utiliser WHERE
, JOIN
, ORDER BY
, etc.
Sont là des aspects ou des différences entre les méthodes que je suis absent? Dans le cas d'une procédure stockée utilisée comme une requête, ce qui est recommandé?
OriginalL'auteur Paul Bellora | 2011-09-17
Vous devez vous connecter pour publier un commentaire.
Je suis sûr que la deuxième approche ne fonctionne pas du tout avec certains SGBDR, mais puisque vous allez seulement utiliser PostgreSQL, qui ne devrait pas trop. Pour votre cas simple, il n'y a vraiment pas beaucoup d'un inconvénient. Il y a deux questions que je peux voir popping up:
En fonction de la façon dont les procédures stockées sont écrits, ils peuvent vous demander d'enregistrer des paramètres pour l'exécution de la procédure. Cela ne va pas être possible du tout avec les requêtes préparées. Si vous contrôler à la fois la création de la procédure stockée et le code appelant, vous avez probablement n'avez pas à vous inquiéter à ce sujet.
Il limite l'efficacité de l'appel de procédures stockées dans la première place. L'un des principaux avantages d'une procédure stockée est d'encapsuler la logique de l'interrogation au niveau base de données. Cela vous permet de régler la requête ou dans certains cas d'ajouter des fonctionnalités sans avoir à apporter des modifications à votre code. Si vous envisagez sur l'ajout de clauses where rejoint les résultats de l'appel de procédure stockée, pourquoi ne pas simplement mettre l'original de la requête dans votre java couche?
OriginalL'auteur dlawrence
La principale différence, c'est l'indépendance et encapsulé mode de programmation.
Imaginez que vous êtes un Programmeur Java et vous ne savez pas comment utiliser la Base de données, de cette façon, vous ne pouvez pas utiliser la deuxième méthode et u va rencontrer des problèmes dans la seconde.
Première méthode vous permet de faire votre code java, et demander à quelqu'un d'écrire les cahiers pour vous en tant que Procédure Stockée, de sorte que u peut les utiliser facilement.
Je suis d'accord avec @dlawrence
OriginalL'auteur John_sei4