martes oct 16, 2007
martes oct 16, 2007
Los
procedimientos almacenados son un herramienta que ha estado presente desde hace
ya un buen tiempo los principales motores de bases de datos para poder
encapsular lógica de aplicación y además SQL dentro del motor. Las ventajas de
poder ocupar los procedimientos almacenados dentro un sistema son variadas,
pero principalmente con el hecho de encapsular lógica dentro de ellas ayuda a
tener bajos niveles de acoplamiento, y altos niveles de cohesión considerando
los objetos que estamos haciendo persistentes dentro de nuestra aplicación.
Java DB, la versión soportada por SUN de Apache Derby, cuenta con varias funcionalidad des gran interés, tal como funcionar en modo “endebido” o cliente/servidor, soporte para tipos de datos BLOB and CLOB, entre otras... Pero es la capacidad de poder crear procedimientos almacenados lo que ahora nos ha interesado, sobre todo desde el punto de vista que los procedimientos almacenados que se crean en Java DB son hechos en Java. Esta capacidad de crear procedimientos almacenados en Java, que han ganado gran popularidad en grandes motores como Oracle, tiene varias ventajas comparativas con respecto a los procedimientos tradicionales:
Primeros pasos.
Si bien es cierto JavaDB viene por defecto con el JDK 1.6, para esta ocasión ocupare la versión de Java DB que se integra con Netbeans y el Enterprise Pack, donde vienen algunas bases de datos de ejemplo como “travel”.
Para
verificar si tenemos instalada la interfaz para el manejo de Java DB, debemos
ir al menú “Tools” y verificar que aparezca “Java DB Database”.

Ahora crearemos un nuevo proyecto
Java del tipo Java Application llamado “JavaStoredProcedure”. Ahora dentro de el crearemos una clase
llamada “ProcedureTest” donde pondremos el código para nuestro procedimiento
almacenado. En este caso el
procedimiento almacenado simplemente consulta algunos datos de la base de datos
“travel” según el parámetro que le estoy dando que corresponde a un ID de
persona. 
Ahora agregamos el siguiente código para la clase:
| public class ProcedureTest { /** Creates a new instance of ProcedureTest */ public ProcedureTest() { } public static void getNombre(int id, ResultSet[] rsOut) { try{ Connection conn = DriverManager.getConnection("jdbc:default:connection"); PreparedStatement ps1 = conn.prepareStatement("SELECT NAME FROM PERSON WHERE PERSONID=?"); ps1.setInt(1, id); rsOut[0] = ps1.executeQuery(); conn.close(); } catch(SQLException e){ System.err.println(e.toString()); } } } |
Ahora es muy importante para poder después ingresar este procedimiento dentro de la base de datos empaquetar la clase en un JAR. En el caso de Netbeans lo realiza de manera automática, verificándolo en las propiedades del proyecto.

Una vez construida y empaquetada la clase, debemos realizar las operaciones sobre la base de datos. Para eso vamos a iniciar la instancia de “travel” y abrir una nueva ventana para la ejecución de comandos.

Ahora para poder ingresar este procedimiento debemos crear primero el procedimiento dentro de la base de datos que “enmascarara” al procedimiento que está hecho en Java. De aquí cabe destacar que en este caso tenemos solo 1 “Dynamic Result Set”, ya que este va a depender de las preguntas que estemos realizando a la base de datos y la definición que hicimos en nuestro código Java donde dimos como parámetro 1 resultset de salida. Ademas el “External Name” corresponde al nombre de la clase y el método que generamos como procedimiento almacenado.
|
CREATE PROCEDURE GET_NOMBRE(IN id INTEGER) PARAMETER STYLE JAVA LANGUAGE JAVA READS SQL DATA DYNAMIC RESULT SETS 1 EXTERNAL NAME 'ProcedureTest.getNombre' |
Una vez ejecutado esto con éxito, debemos ocupar el comando SQLJ.INSTALL que se encarga de cargar el JAR que contiene nuestro procedimiento almacenado en la base datos. El primero parámetro que recibe corresponde a la dirección donde se encuentra el JAR a instalar(dar la ruta completa) y el segundo corresponde al contexto del procedimiento creado en la base de datos, es decir, “ESQUEMA.CLASE”.
|
CALL SQLJ.install_jar('C:\Documents and
Settings\Administrador\Mis |
| CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.classpath', 'travel.ProcedureTest'); |
Ahora a probar...