13

PostgreSQL documentation recomienda utilizar un CallableStatement para llamar a los procedimientos almacenados.procedimientos almacenados como consultas: CallableStatement vs. PreparedStatement

En el caso de un procedimiento almacenado que devuelve un conjunto de filas, ¿cuáles son las diferencias entre el uso CallableStatement:

String callString = "{ call rankFoos(?, ?) }"; 
CallableStatement callableStatement = con.prepareCall(callString); 
callableStatement.setString(1, fooCategory); 
callableStatement.setInt(2, minimumRank); 
ResultSet results = statement.executeQuery(); 

y usando un regulares 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(); 

como yo lo entiendo, CallableStatement ofertas una forma de llamar a los procedimientos almacenados que es independiente del idioma. Esto no me importa, ya que sé que estoy usando PostgreSQL. Por lo que yo puedo ver, la ventaja obvia de usar el PreparedStatement es una consulta más versátil, tratando el procedimiento almacenado como una mesa, sobre la que puedo usar WHERE, JOIN, ORDER BY, etc.

¿Hay aspectos o diferencias entre los métodos que me falta? En el caso de un procedimiento almacenado utilizado como consulta, ¿cuál es el recomendado?

Respuesta

12

Estoy bastante seguro de que el segundo enfoque no funciona en absoluto con algunos RDBMS, pero como solo va a utilizar PostgreSQL, eso no debería importar demasiado. Para su caso simple, realmente no hay muchos inconvenientes. Hay dos cuestiones que puedo ver aparecer:

  1. Dependiendo de cómo los procedimientos almacenados se escriben, pueden requerir que se registre a cabo parámetros con el fin de ejecutar el procedimiento. Eso no será posible en absoluto con declaraciones preparadas. Si controla tanto la creación del procedimiento almacenado como el código de llamada, probablemente no tenga que preocuparse por esto.

  2. Limita la efectividad de llamar a procedimientos almacenados en primer lugar. Una de las principales ventajas de un procedimiento almacenado es encapsular la lógica de consulta en el nivel de la base de datos. Esto le permite ajustar la consulta o, en algunos casos, agregar funcionalidad sin tener que realizar cambios en su código. Si planea agregar cláusulas where, se une a los resultados de la llamada al procedimiento almacenado, ¿por qué no simplemente coloca la consulta original en su capa java?

7

La principal diferencia es la independencia y la forma de programación encapsulada.

Imagine que es un Programador de Java y no sabe cómo usar la Base de datos, de esta manera no puede usar el segundo método y encontrará problemas de la segunda manera.

El primer método le permite hacer su código java, y pedirle a alguien que escriba las reglas para usted como procedimiento almacenado, para que pueda usarlas fácilmente.

Estoy de acuerdo con @dlawrence

+0

Buena idea. ¡Gracias! –

Cuestiones relacionadas