Store Procedure con parámetros de salida

Hibernate-logoEs esta entrada les quiero compartir como invocar un Store Procedure con Parametros de Salida y recuperarlos por medio de Hibernate.

Es ejemplo lo realizo con la Base de datos Oracle 11g XE y con la versión de Hibernate 4.3.

Codigo del Store Procedure.

Store Procedure
Fig. 1: Codigo del SP

 

A continuación el código con la explicación:

package com.oscarblancarte.hibernate;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import javax.persistence.ParameterMode;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.procedure.ProcedureCall;
import org.hibernate.service.ServiceRegistry;

public class HibernateProcedure {

	private static final SessionFactory sessionFactory = buildSessionFactory();

	public static void main(String[] args) {
		// Obtenemos la session
		Session session = getSessionFactory().getCurrentSession();

		// Abrimos transacción <OPCIONAL>
		session.beginTransaction();

		// Nombre del SP
		ProcedureCall call = session.createStoredProcedureCall("PROC1");
		// Registramos el primer parametros de entrada
		call.registerParameter(1, String.class, ParameterMode.IN);
		// Registramos el segundo parametro de salida
		call.registerParameter(2, Integer.class, ParameterMode.OUT);

		//Establecemos el valor del primer parametros de entrada
		call.getParameterRegistration(1).bindValue("hola");
		//Ejecutamos el SP y obtenemos el parametro 2, el cual es de salida(out)
		Object salida = call.getOutputs().getOutputParameterValue(2);
		//Se imprime el parametro de salida
		System.out.println("SALIDA ==> " + salida.toString());

		// cerramos transacción <OPCIONAL>
		session.getTransaction().commit();
		System.out.println("FIN");
	}

	private static SessionFactory buildSessionFactory() {
		try {
			Configuration configuration = new Configuration();
			configuration.configure("hibernate.cfg.xml");
			ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
					.applySettings(configuration.getProperties()).build();
			SessionFactory sessionFactory = configuration
					.buildSessionFactory(serviceRegistry);
			return sessionFactory;
		} catch (Throwable ex) {
			System.err.println("Initial SessionFactory creation failed." + ex);
			throw new ExceptionInInitializerError(ex);
		}
	}

	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}
}

La clave es registrar adecuadamente los parámetros, registrando su tipo de dato y Mode el cual puede ser de entrada o salida.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *