post icon

Ejecutar procedimiento almacenado desde Java (JDBC)

En Java invocar a un procedimiento almacenado que no devuelve valores es bastante sencillo hacerlo desde JDBC, funciona de la misma manera que con cualquier base de datos, solo es cuestión de cambiar la cadena de conexión y el driver, el resto va igual.

En el ejemplo veremos con MySQL, pero como vengo diciendo cambien los 2 factores y podrán usarlo con cualquier otro motor de base de datos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package conexionDB;
 
import java.sql.Connection;
 
public class ConexionMySQL {
 
	public static Connection con_mysql;
 
	public static Connection conectar(String pHost, String pUser, String pPassword, String pDataBase) throws Exception {
		try {
			String databaseURL = "jdbc:mysql://" + pHost + "/" + pDataBase;
			Class.forName("com.mysql.jdbc.Driver");
			con_mysql = java.sql.DriverManager.getConnection(databaseURL, pUser, pPassword);
			//System.out.println("Conexion con MySQL Establecida..");
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception(e);
		}
		return con_mysql;
	}
}

En la siguiente clase veremos como implementar la clase anterior para hacer la conexion, además de invocar el procedimiento almacenado.

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
// imports necesarios
import conexionDB.ConexionMySQL;
import java.sql.CallableStatement;
.
.
Connection connMY = null;
try{
	// creamos la conexion
	connMY = ConexionMySQL.conectar("192.168.1.100", "sa", "*******", "devtroce");
	// establecemos que no sea autocommit,
	// asi controlamos la transaccion de manera manual
	connMY.setAutoCommit(false);
	/* instanciamos el objeto callable statement
	 * que usaremos para invocar el SP
	 * La cantidad de "?" determina la cantidad
	 * parametros que recibe el procedimiento
	 */
	CallableStatement prcProcedimientoAlmacenado = connMY.prepareCall("{ call NuestroProcedimientoAlmacenado(?,?,?) }");
	// cargar parametros al SP
	prcProcedimientoAlmacenado.setInt("pParametro1", 1);
	prcProcedimientoAlmacenado.setString("pParametro2", "Devtroce.com");
	prcProcedimientoAlmacenado.setInt("pParametro3", 49);
	// ejecutar el SP
	prcProcedimientoAlmacenado.execute();
	// confirmar si se ejecuto sin errores
	connMY.commit();
} catch (Exception e) {
	// deshacer la ejecucion en caso de error
	connMY.rollback();
	// informar por consola
	e.printStackTrace();
} finally {
	// cerrar la conexion
	connMY.close();
}

A pedido de Moise, edito el post y agrego la estructura de la tabla y un Stored Procedure que cumple para ejecutar con el código aquí:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE TABLE devtroce(
	id int NOT NULL,
	campo2 varchar(50) NOT NULL,
	campo3 int NOT NULL
) ON PRIMARY
 
CREATE PROCEDURE NuestroProcedimientoAlmacenado
	@id int,
	@campo2 varchar(50),
	@campo3 int
AS
BEGIN
       INSERT INTO
		devtroce
	VALUES (
		@id,
		@campo2,
		@campo3);
END

Comentarios desde Facebook:

  1. Drk MEXICO Google Chrome Mac OS
    8 abril 2013 at 20:18 #

    Hola, Disculpa soy nuevo en esto de los códigos… podrías decirme que va escrito en donde pusiste los puntos?

    import java.sql.CallableStatement;
    .
    .
    Connection connMY = null;
    try{

    por favor

  2. Leonardo COLOMBIA Google Chrome Windows
    26 mayo 2012 at 14:05 #

    Si el procedimiento devuelve mas de una tupla como se puede leer en la clase java que lo invoca?

  3. solisesinc MEXICO Google Chrome Windows
    14 marzo 2012 at 00:35 #

    hola amigo me gustaria que me ayudaras hasta ahora si me funciona el puro procedimiento, tendrias algun ejemplo para cargar la informacion en una jtable y en un combobox… si pudieras poner el ejemplo seria de gran ayuda… de antemano muchas gracias

  4. kike ARGENTINA Mozilla Firefox Windows
    7 diciembre 2011 at 05:29 #

    hola.. una consulta,(no se si sera un poco tonta pero me quiero sacar la duda)

    En el caso de cuando se ejecuta una consulta que te devuelve varios registros, se guardan en una variable del tipo ResultSet (En java), que tipo de variable usas para guardar el resultado que te devuelve una funcion en mysql? en todo caso como es la sintaxis?

    • GeekZero PARAGUAY Google Chrome Windows
      7 diciembre 2011 at 08:20 #

      Es la misma sintaxis, solo que tu query sql seria

      1
      
      select nombreFuncion(parametro1, parametro2, parametrosN)

      Y solo te retornará un valor escalar.

      • kike ARGENTINA Mozilla Firefox Windows
        7 diciembre 2011 at 12:37 #

        haa.. bien, o sea que ese resultado lo puedo guardar en una variable, que sea del tipo que retorna simplemente? no hace falta un ResultSet

  5. Xavier Saltos ECUADOR Internet Explorer Windows
    20 noviembre 2011 at 19:10 #

    como lleno un combo con un sp por lo geneal lo lleno con resulset y mientras se verdad lo lleno como hago eso un SP

  6. cejebuto Internet Explorer Windows
    15 octubre 2011 at 09:16 #

    Buenas, el import:

    import conexionDB.ConexionMySQL;

    no lo reconoce. y en mi netbeans no aparece esa libreria, y la e buscado y no la encuentro. alquien por favor me podria decir, como encontrarla, o en su defecto enviarmela a mi correo. cejebuto@hotmail.com gracias.

    • skywalker Internet Explorer Windows
      31 enero 2012 at 10:32 #

      Hola!, te recomiendo que dejes de buscar esa libreria ya que no existe en ningun ide. Te explico lo que quiere decir:
      “import conexionDB.ConexionMySQL;”

      conexionDB //hace referencia a la carpeta o paquete donde se guarda la clase.

      ConexionMySQL //es la clase que esta al inicio de esta pagina, y con la cual se realiza la conexion, y si no te diste cuenta aqui te la pego tal cual:

      ————————————————————
      package conexionDB; //<– VES ES LA CARPETA DONDE SE GUARDA!!!
      import java.sql.Connection;

      public class ConexionMySQL { //<— ESTA ES LA CLASE Y SIGUE!!!

      public static Connection con_mysql;

      public static Connection conectar(String pHost, String pUser, String pPassword, String pDataBase) throws Exception {
      try {
      String databaseURL = "jdbc:mysql://" + pHost + "/" + pDataBase;
      Class.forName("com.mysql.jdbc.Driver");
      con_mysql = java.sql.DriverManager.getConnection(databaseURL, pUser, pPassword);
      //System.out.println("Conexion con MySQL Establecida..");
      } catch (Exception e) {
      e.printStackTrace();
      throw new Exception(e);
      }
      return con_mysql;
      }
      }
      ———————————————————–

      Espero haberte ayudado!, Si quieres seguir el ejemplo solo cambia la ruta del import con el nombre del paquete donde haz guardado esta clase y con el nombre que le diste. Bye!

  7. leonardo alejandro MEXICO Mozilla Firefox Windows
    31 julio 2011 at 16:59 #

    Muchas gracias por el material un saludo desde mexico…

  8. Carlos O. PANAMA Mozilla Firefox Windows
    1 junio 2011 at 18:53 #

    Gran Aporte GEEK… saludos desde Panamá

  9. lalo MEXICO Internet Explorer Windows
    11 diciembre 2010 at 20:58 #

    Tarde pero seguro.
    Gracias GeekZero he logrado solucionar el problema.

    GRACIAS!!!!!!!!

  10. alex PERU Google Chrome Windows
    10 diciembre 2010 at 18:46 #

    Muy interesante el ejemplo pero tengo una duda los valores que mandas en el .setString(“pParametro1″,1); que significa ese 1? es necesario darle valores, si no le pongo valores no funcionara?

    de antemano gracias.

    • GeekZero PARAGUAY Google Chrome Windows
      11 diciembre 2010 at 12:43 #

      Hola Alex, esos son los parametros que debe recibir el stored procedure, siempre debes enviar la misma cantidad de parametros como parametros de entrada tenga el SP y obligatoriamente debes asignarle un algun valor. En caso que tu SP no reciba parametros omites esas lineas, nada mas debes invocar al metodo execute();
      Recuerda que deben coincidir tambien en el tipo de dato los parametros..

  11. lalo MEXICO Internet Explorer Windows
    30 noviembre 2010 at 11:34 #

    Una ayudadita por favor.

    Si quiero utilizar este codigo para invocar a un proceso almacenado que no recibe ni retorna parametros. ¿que parte debo omitir? a mi juicio deberia omitir la parte del codigo donde se le mandan los parametro pero no me resulta.

    De antemano muchas gracias.

    • GeekZero PARAGUAY Mozilla Firefox Windows
      1 diciembre 2010 at 08:02 #

      Hola Lalo, estas lineas nada mas debes eliminar.

      1
      2
      3
      
      prcProcedimientoAlmacenado.setInt("pParametro1", 1);
      	prcProcedimientoAlmacenado.setString("pParametro2", "Devtroce.com");
      	prcProcedimientoAlmacenado.setInt("pParametro3", 49);

      Que error te devuelve la ejecucion?

  12. Moises PERU Internet Explorer Windows
    30 agosto 2010 at 23:42 #

    Gracias por el aporte, solo para solicitarles un ejemplo mas detallado con stored procedure creado en sql server y ejecutado desde java.

    • GeekZero PARAGUAY Google Chrome Windows
      31 agosto 2010 at 10:13 #

      Hola Moises, he agregado al Post una tabla y un SP para mayor comprension, espero te sirva :)

Trackbacks/Pingbacks

  1. Leer datos de una base de datos con java | DevTroce.com WordPress - 28 junio 2010

    [...] = 'compact';ShareHace tiempo vimos como ejecutar un procedimiento almacenado desde Java en una base de datos, en esta oportunidad veremos algo semejante, cargaremos datos de la [...]

Responder