Hola.
En este post encontrarás cómo llamar un procedimiento almacenado hecho en PL/SQL.
Cuando se desarrollan aplicaciones empresariales es muy común que la lógica de negocio se encuentre desarrollada en pl/sql, es una buena estrategia lanzar excepciones cuando se encuentra un error de lógica de negocio en el procedimiento almacenado.
Dicha execption debe enviar el mensaje de error para que este sea capturado en Java y tratada en el componente que hace el llamado al procedimiento almacenado.
En una aplicación web se debería mostrar el mensaje de la excepción lanzada por el componente de lógica de negocio desarrollado en pl/sql. Código del procedimiento almacenado en pl/sql. Este procedimiento lanza una exception si se envía un valor numérico diferente de 1, la exception puede ser tratada en el bloque de código catch en Java.
create or replace Procedure ProGetPrueba1(prfCursor out Sys_Refcursor,pnNumber In Number) Is
voCursor Sys_Refcursor:=null;
Begin
--Valor 1: funciona OK, Valor diferente a 1 retorna error.
if pnNumber = 1 then
Open voCursor For
Select 1 as CODIGO,'Vortexbird' as NOMBRE
From DUAL;
prfCursor:=voCursor;
else
RAISE_APPLICATION_ERROR (-20000, 'El valor no puede ser negativo'); --voCursor;
end if;
End ProGetPrueba1;
Código Java para hacer el llamado al procedimiento almacenado.
package com.vortexbird.demo.test;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import oracle.jdbc.OracleTypes;
/** * @author dgomez@vortexbird.com
*/
public class TestStore {
public static void main(String[] args) {
String url="jdbc:oracle:thin:@127.0.0.1:1521:xe";
String user="banco";
String password="banco";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection connection=DriverManager.getConnection(url,user,password);
//LLamado del procedimiento al estilo pl/sql
String sql="begin ProGetPrueba1(?,?); end;";
CallableStatement callableStatement=connection.prepareCall(sql);
//Parametros de entrada
callableStatement.registerOutParameter(1, OracleTypes.CURSOR);
callableStatement.setLong(2, 1L);
callableStatement.execute();
//Se obtiene el cursor en forma de ResultSe
ResultSet rs = (ResultSet)callableStatement.getObject(1);
while (rs.next()){
System.out.println(rs.getLong("CODIGO"));
System.out.println(rs.getString("NOMBRE"));
} rs.close();
callableStatement.close();
connection.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
//Imprime el mensaje de la exception lanzada en pl/sql si el valor es diferente de 1
e.printStackTrace();
}
}
}
Es todo, de esta forma se llama un procedimiento almacenado en escrito en pl/sql desde Java usando JDBC.
No hay comentarios