SPRING FRAMEWORK - EJECUTANDO PROCEDIMIENTOS ALMACENADOS

SPRING FRAMEWORK - EJECUTANDO PROCEDIMIENTOS ALMACENADOS
FUNDAMENTOS
Puedes usar cualquiera de los métodos query de JdbcTemplate o el método update para ejecutar el procedimiento almacenado, teniendo en cuenta si retorna o no un resultado.
Los procedimientos de SQL Server o MySQL pueden retornar directamente el resultado de una consulta utilizando la sentencia SELECT.
También dispones de la clase StoreProcedure donde dispones de opciones de mayor control para la ejecución de procedimientos almacenados.
SINTAXIS
El objetivo es ejecutar procedimientos almacenados que no tengan parametros de salida.
A continuación tienes la sintaxis que debes utilizar.
jdbcTemplate.update("call procedimiento (?, ?, ...)", parámetros);
PROCEDIMIENTO A EJECUTAR
El ejemplo que muestro a continuación es utilizando Oracle y el modelo es EUREKABANK, que lo encuentras en:
El procedimiento es para registrar una transacción que ejecuta un retiro de una cuenta.
create or replace procedure usp_egcc_retiro
(p_cuenta varchar2, p_importe number,p_empleado varchar2, p_clave varchar2)
as
  v_msg varchar2(1000);
  v_saldo number(12,2);
  v_moneda char(2);
  v_cont number(5,0);
  v_estado varchar2(15);
  v_costoMov number(12,2);
  v_clave varchar2(10);
begin
  -- Lee datos de la cuenta
  select 
    dec_cuensaldo, chr_monecodigo, int_cuencontmov, 
    vch_cuenestado, chr_cuenclave
    into v_saldo, v_moneda, v_cont, v_estado, v_clave
    from cuenta
    where chr_cuencodigo = p_cuenta 
    for update;
  -- Verifica los datos de la cuenta
  if v_estado != 'ACTIVO' then
    raise_application_error(-20001,'Cuenta no esta activa.');
  end if;
  if v_clave != p_clave then
    raise_application_error(-20001,'Datos incorrectos.');
  end if;
  -- Costo de operación
  select dec_costimporte
    into v_costoMov
    from costomovimiento
    where chr_monecodigo = v_moneda;
  -- Verifica el saldo
  v_saldo := v_saldo - p_importe - v_costoMov;
  if v_saldo < 0.0 then
    raise_application_error(-20001,'Saldo insuficiente.');
  end if;
  -- Actualiza la cuenta
  update cuenta
    set dec_cuensaldo = v_saldo,
    int_cuencontmov = int_cuencontmov + 2
    where chr_cuencodigo = p_cuenta;
  -- Registra el movimiento de retiro
  v_cont := v_cont + 1;
  insert into movimiento(chr_cuencodigo,int_movinumero,dtt_movifecha,
    chr_emplcodigo,chr_tipocodigo,dec_moviimporte,chr_cuenreferencia)
    values(p_cuenta,v_cont,sysdate,p_empleado,'004',p_importe,null);
  -- Registra el costo de la operación
  v_cont := v_cont + 1;
  insert into movimiento(chr_cuencodigo,int_movinumero,dtt_movifecha,
    chr_emplcodigo,chr_tipocodigo,dec_moviimporte,chr_cuenreferencia)
    values(p_cuenta,v_cont,sysdate,p_empleado,'010',v_costoMov,null);
  -- Confirmar la Tx
  commit;
exception
  when others then
    v_msg := sqlerrm; -- capturar mensaje de error
    rollback; -- cancelar transacción
    raise_application_error(-20001,v_msg);
end;
EJECUCIÓN DEL PROCEDIMIENTO
A continuación tienes el código Java para ejecutar el procedimiento usp_egcc_retiro:
public void procRetiro
(String cuenta, double importe,String codEmp, String clave) {

  jdbcTemplate.update("call usp_egcc_retiro (?, ?, ?, ?)", 
    cuenta, importe, codEmp, clave);

}
Debes tener en cuenta que la transacción es controlada en el procedimiento almacenado.
VIDEO DEMOSTRATIVO
CODIGO FUENTE - EUREKA-WEB-MYSQL-SPRING
En esta sección te presento un video de una aplicación web desarrollada SPRING FRAMEWORK y MYSQL.
Tú tienes acceso al código fuente de esta aplicación, después del video tienes el enlace.



1 comentario:

  1. prodrias hacer un procedimiento almacenado que haga un listado de varias entidades

    ResponderEliminar