Un procedimiento almacenado es conjunto de instrucciones escritas en lenguaje Transact-SQL (T-SQL) compiladas y ejecutadas dentro de una base de datos relacional. Normalmente es el administrador de la base de datos el que los define y documenta, especificando los parámetros que admite y el resultado que se obtiene.
La gran ventaja de los procedimientos almacenados es que ya están compilados, con lo que su uso es más eficiente que la típica sentencia SQL definida en el programa. En éstas el gestor de base de datos tiene que analizarla y compilarla antes de la ejecución. Sin embargo, con los procedimientos almacenados el análisis y compilación ya está realizado. Otra ventaja tiene que ver con la organización: la capacidad de administrar de manera centralizada las tareas reutilizables.
Una posible desventaja es que en los procedimientos almacenados tenemos frecuentemente tanto SQL estándar como utilidades dependientes del fabricante de la base de datos, con lo que se resta portabilidad.
Nota sobre MySQL: hay disponibilidad de procedimientos almacenados a partir de la versión 5.0
Supongamos el siguiente procedimiento:
create procedure SHOW_VENTAS_CLIENTE as select cliente.cod, cliente.nombre, venta.precio from venta, cliente where venta.cod = cliente.cod order by cliente.nombre
El siguiente código pone la sentencia SQL dentro de la variable crearProc, que utilizaremos más adelante:
String crearProc = "create procedure SHOW_VENTAS_CLIENTE as " + "select ....";
Con executeUpdate() podemos crear el procedimiento almacenado en la base de datos:
Statement stmt = con.createStatement(); stmt.executeUpdate(crearProc);
Utilizamos CallableStatement, que hereda de PreparedStatement:
CallableStatement cs = con.prepareCall("{ call SHOW_VENTAS_CLIENTE }");
ResultSet rs = cs.executeQuery();
Si el procedimiento modifica datos usariamos executeUpdate(). Si nuestro procedimiento realizase una mezcla de modificación y consulta usaremos execute(). Puesto que hereda de PreparedStatement podemos utilizar parámetros en el procedimiento.