You are on page 1of 3

COMO EJECUTAR UN PROCEDIMIENTO

ALMACENADO DESDE JAVA CON JDBC


Publicado el Martes 26 de noviembre de 2013 en Java, Oracle por Ivn Salas

Llamar a un procedimiento almacenado usando JDBC es muy similar a ejecutar una


PreparedStatement, sino te acuerdas muy bien como funcionaba pues verlo en un post anterior en el
que hice un pequeo tutorial de como usar JDBC aqu.
Como en esa ocasin use MySQL, esta vez para cambiar voy a usar Oracle, aunque a efectos
prcticos la nica diferencia es el driver que hay que cargar.
El cdigo SQL para generar la tabla que voy a usar en este ejemplo es el siguiente. Tambin he
aadido unas pocas filas para poder ver los resultados.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

CREATE TABLE ALUMNOS(


ID NUMBER(5)
CONSTRAINT ALUMNO_PRIMARY_KEY PRIMARY KEY,
NOMBRE VARCHAR2(15),
PAIS VARCHAR2(20),
FECHA_NACIMIENTO DATE,
SEXO VARCHAR2(1)
CONSTRAINT ALUMNO_CHK_SEXO CHECK(SEXO IN('M','H')),
CURSO VARCHAR2(20)
);
INSERT INTO ALUMNOS VALUES(1,'Pepito Gonzalez','Rumania','5-Mayo-95','H','Bases de datos');
INSERT INTO ALUMNOS VALUES(2,'Laura Sanz','Mexico','14-Abril-86','M','Contabilidad');
INSERT INTO ALUMNOS VALUES(213,'Luis Perez','Argentina','18-May-78','H','Cocina');
INSERT INTO ALUMNOS VALUES(12321,'Susana Perez','Espaa','29-Sep-90','M','Java');
INSERT INTO ALUMNOS VALUES(12322,'Fernando Torres','Espaa','30-Julio-91','H','Java');
INSERT INTO ALUMNOS VALUES(123,'Miriam Ruiz','Cuba','29-Octubre-75','M','Contabilidad');
INSERT INTO ALUMNOS VALUES(129,'Cristian Lopez','Espaa','4-Julio-67','H','Economia');
INSERT INTO ALUMNOS VALUES(6235,'Simone Simons','Holanda','17-Enero-85','M','Ballet');
INSERT INTO ALUMNOS VALUES(10012,'Mustafa Kemal','Turquia','19-Mayo-81','H','Ballet');

El procedimiento almacenado que usar en el ejemplo es este donde nos devuelve el nombre, el sexo
y el curso del alumno cuyo id le pasamos como primer parmetro.

1 CREATE OR REPLACE PROCEDURE ObtenerDatosAlumno(p_id alumnos.id%TYPE,


2
p_nombre OUT alumnos.nombre%TYPE, p_sexo OUT alumnos.sexo%TYPE,
3
p_curso OUT alumnos.curso%TYPE) AS
4 BEGIN
5
SELECT nombre,
6
CASE sexo
7
WHEN 'H' THEN 'HOMBRE'

8
9
10
11
12
13 END;

ELSE 'MUJER'
END,
curso
INTO p_nombre, p_sexo, p_curso
FROM alumnos WHERE id=p_id;

Con esto ya tenemos nuestra tabla y nuestro procedimiento almacenado guardados en la base de
datos con lo que ya podemos crear una aplicacin java que haga uso de ellos.
Como deca en este ejemplo nos conectamos con JDBC a una base de datos Oracle, por lo que lo
primero que tenemos que hacer es aadir el .jar de Oracle a nuestro proyecto.
Ahora ya esta todo listo y solo falta ver el cdigo necesario para hacer la llamada al procedimiento
almacenado. Para hacerlo lo ms sencillo posible vamos a hacer una aplicacin de consola con un
bucle para leer los IDs de los alumnos por teclado.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

package com.poi;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Ivn Salas
* <http://programandoointentandolo.com>
*/
public class EjemploProcAlmacenado {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in));
int id = -1;
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 system y la contrasea password
cn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "system", "password");
// Llamada al procedimiento almacenado
CallableStatement cst = cn.prepareCall("{call ObtenerDatosAlumno (?,?,?,?)}");

38
39
do {
40
System.out.println("\nIntroduce el ID del alumno:");
41
try {
42
id = Integer.parseInt(entrada.readLine());
43
} catch (IOException ex) {
44
System.out.println("Error...");
45
}
46
47
// Parametro 1 del procedimiento almacenado
48
cst.setInt(1, id);
49
50
// Definimos los tipos de los parametros de salida del procedimiento almacenado
51
cst.registerOutParameter(2, java.sql.Types.VARCHAR);
52
cst.registerOutParameter(3, java.sql.Types.VARCHAR);
53
cst.registerOutParameter(4, java.sql.Types.VARCHAR);
54
55
// Ejecuta el procedimiento almacenado
56
cst.execute();
57
58
// Se obtienen la salida del procedimineto almacenado
59
String nombre = cst.getString(2);
60
String sexo = cst.getString(3);
61
String curso = cst.getString(4);
62
System.out.println("Nombre: " + nombre);
63
System.out.println("Sexo: " + sexo);
64
System.out.println("Curso: " + curso);
65
} while (id > 0);
66
67
} catch (SQLException ex) {
68
System.out.println("Error: " + ex.getMessage());
69
} finally {
70
try {
71
cn.close();
72
} catch (SQLException ex) {
73
System.out.println("Error: " + ex.getMessage());
74
}
75
}
76 }
77
78 }

You might also like