Tomando un procedimiento de almacenamiento tal que:
CREATE OR REPLACE PROCEDURE remove_emp (employee_id NUMBER) AS
tot_emps NUMBER;
BEGIN
DELETE FROM employees
WHERE employees.employee_id = remove_emp.employee_id;
tot_emps := tot_emps - 1;
END;
/
Para ejecutar el procedimiento de almacenamiento de arriba:
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class EjemploProcAlmacenado1 {
public static void main(String[] args) {
Connection cn = null;
try {
// Carga el driver de oracle
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
// Conecta con la base de datos XE con el usuario scott y la contraseña tiger
cn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "scott", "tiger");
// Llamada al procedimiento almacenado
CallableStatement cst = cn.prepareCall("{call remove_emp (104)}");
// Ejecuta el procedimiento almacenado
cst.execute();
System.out.println("borrado");
cst.close();
} catch (SQLException ex) {
System.out.println("Error: " + ex.getMessage());
} finally {
try {
cn.close();
} catch (SQLException ex) {
System.out.println("Error: " + ex.getMessage());
}
}
}
}
En el código:- Las llamadas a los procedimientos almacenados al igual que las
PreparedStatements
y las consultas simples se hacen sobre la conexión, en este caso con el métodoprepareCall()
que nos devuelve unCallableStatement.
- La llamada al procedimiento almacenado además de ir entre comillas por ser un string tiene que ir también entre llaves y tiene el siguiente formato
“{call nombre_procedimiento(params)}”
, dando los parámetros reales espera el procedimiento almacenado. - El procedimiento se ejecuta cuando llamamos al método execute, y como es lógico en el momento en el que se ejecute tienen que estar definidos todos los parámetros tanto de entrada como de salida.