Vous êtes sur la page 1sur 31

Oracle y Java *

* Tomado del curso de Francisco Moreno


13/01/08 Seminario de Bases de Datos 1

Formas de comunicacin entre Java y Oracle

Java dentro de Oracle: Oracle posee su propio compilador y generador de clases Java Java desde afuera de Oracle: Hay 2 Formas:

1. En forma aislada "Stand Alone", es decir, un programa Java que accesa la base de datos e imprime los resultados por "consola"

13/01/08

Seminario de Bases de Datos

Formas de comunicacin entre Java y Oracle

2. Por medio de JSP: Se accesa a la base de datos desde Java y los resultados pueden visualizarse por medio de un navegador. Se requiere para este caso un servidor web (Tomcat, Jrun etc.) Se comenzar con Java dentro de Oracle

13/01/08

Seminario de Bases de Datos

Java dentro de Oracle


Ejecutar en SQL*Plus el siguiente cdigo:
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "prueba" AS public class prueba { public static String Hello(String cadena) { return "Bienvenido a Java con Oracle " + cadena; } }; /
13/01/08 Seminario de Bases de Datos

Java dentro de Oracle


Adicionalmente se debe crear una funcin wrapper (de envoltura) que lo que hace es asociar una funcin de Oracle con un mtodo de la clase Java: Ejecutar en SQL*Plus: Funcin wrapper
CREATE OR REPLACE FUNCTION saludo(nom VARCHAR2) RETURN VARCHAR2 AS LANGUAGE JAVA NAME 'prueba.Hello (java.lang.String) return java.lang.String'; /

13/01/08

Seminario de Bases de Datos

Java dentro de Oracle


Para invocarla se hace lo siguiente: DROP TABLE estudiante; CREATE TABLE estudiante( cedula NUMBER(8) PRIMARY KEY, nombre VARCHAR2(15) ); INSERT INTO estudiante VALUES (7173, 'Pedro'); INSERT INTO estudiante VALUES (7178, 'Luis'); INSERT INTO estudiante VALUES (4311, 'Mara');

13/01/08

Seminario de Bases de Datos

Java dentro de Oracle


Ejecutar: SELECT cedula, saludo(nombre) FROM estudiante;

Si se dispone de archivos .class ya generados pero no se posee el fuente*, dichas clases se pueden cargar usando el comando desde la lnea de comando (DOS, UNIX etc.) as:
* Aunque existen programas que permiten obtener el cdigo fuente desde un .class como Decafe Pro

loadjava

13/01/08

Seminario de Bases de Datos

Java dentro de Oracle

Abrir cualquier editor de Java (JCreator, Java Editor, Kawa etc.) compilar el siguiente cdigo para generar el .class (Recordar que el nombre del archivo fuente debe ser prueba2.java ) public class prueba2 { public static String Hello(String cadena) { return "Otra bienvenida a Java con Oracle " + cadena; } };

13/01/08

Seminario de Bases de Datos

Java dentro de Oracle

Si la compilacin es exitosa, se debe generar el archivo prueba2.class ,cargarlo a Oracle desde DOS usando el comando: Nombre de la BD
loadjava -user username/password@bd prueba2.class

Nota: Antes de ejecutar el comando situarse en el directorio donde est el archivo prueba2.class o darle el camino completo

13/01/08

Seminario de Bases de Datos

Java dentro de Oracle


Ahora en Oracle:(SQL*Plus)

CREATE OR REPLACE FUNCTION saludo2(nom VARCHAR2) RETURN VARCHAR2 AS LANGUAGE JAVA NAME 'prueba2.Hello (java.lang.String) return java.lang.String'; /
SELECT cedula, saludo(nombre), saludo2(nombre) FROM estudiante;

13/01/08

Seminario de Bases de Datos

10

Java dentro de Oracle

Ahora veamos un ejemplo ms complejo: Vamos a ejecutar en SQL*Plus el siguiente cdigo:


CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "Paymaster" AS import java.sql.*; import java.io.*; import oracle.sql.*; import oracle.jdbc.driver.*; import java.math.*;

Contina
13/01/08 Seminario de Bases de Datos 11

Java dentro de Oracle

public class Paymaster { public static BigDecimal wages(STRUCT e) throws java.sql.SQLException { Object[] attribs = e.getAttributes(); BigDecimal sal = (BigDecimal)(attribs[2]); // [2] = salario BigDecimal comm = (BigDecimal)(attribs[3]);//[3] = comision BigDecimal pay = sal; if (comm != null) pay = pay.add(comm); return pay; } } /

Fin del cdigo


13/01/08 Seminario de Bases de Datos 12

Java dentro de Oracle


Crear adicionalmente por medio de SQL*Plus: CREATE OR REPLACE TYPE emple_type AS OBJECT( [0] codigo NUMBER(4), [1] nom VARCHAR2(10), [2] salario NUMBER(6), [3] comision NUMBER(6) ); / DROP TABLE empleado; CREATE TABLE empleado OF emple_type ( codigo PRIMARY KEY, salario NOT NULL );
13/01/08 Seminario de Bases de Datos

10

Desde el punto de vista de Java este es el orden de los atributos en Object

13

Java dentro de Oracle


INSERT INTO empleado VALUES(10, 'Luis',100, 50); INSERT INTO empleado VALUES(22, 'Lisa', 200, null); INSERT INTO empleado VALUES(33, 'Casandra', 300, 10); Se crea la funcin de mapeo (wrapper): CREATE OR REPLACE FUNCTION sal_tot(e emple_type) RETURN NUMBER AS LANGUAGE JAVA NAME 'Paymaster.wages (oracle.sql.STRUCT) return BigDecimal'; /

11

13/01/08

Seminario de Bases de Datos

14

Java dentro de Oracle


Ahora: SELECT 'El salario total del empleado con cdula '|| TO_CHAR(codigo) || ' es: '|| sal_tot(VALUE(e)) FROM empleado e;

12

Se le est pasando a Java el objeto de Oracle completo!

13/01/08

Seminario de Bases de Datos

15

Java dentro de Oracle

13

Un mtodo de un tipo puede "prcticamente" ser implementado en Java: Crear el siguiente Cdigo Java en SQL*Plus:

CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "num" AS import java.math.*; import java.math.BigDecimal; public class num { public static BigDecimal square(BigDecimal n) { return n.multiply(n); } } /
13/01/08 Seminario de Bases de Datos 16

Java dentro de Oracle

14

Funcin de mapeo (Wrapper):


CREATE OR REPLACE FUNCTION cuadradojava(n IN NUMBER) RETURN NUMBER AS LANGUAGE JAVA NAME 'num.square(java.math.BigDecimal) return java.math.BigDecimal'; / Creacin del tipo: DROP TYPE numero_tip FORCE; CREATE TYPE numero_tip AS OBJECT ( numero NUMBER(6), MEMBER FUNCTION cuadrado(n IN number) RETURN NUMBER ); /

13/01/08

Seminario de Bases de Datos

17

Java dentro de Oracle

15

Creacin del cuerpo del tipo:

CREATE OR REPLACE TYPE BODY numero_tip AS MEMBER FUNCTION cuadrado(n IN number) RETURN NUMBER IS BEGIN RETURN cuadradojava(numero); END cuadrado; Se invoca a la funcin Wrapper END; /

Creacin de tabla e invocacin del mtodo:

CREATE TABLE numeros OF numero_tip; INSERT INTO numeros VALUES(3); INSERT INTO numeros VALUES(9); SELECT numero, l.cuadrado(numero) FROM numeros l; 13/01/08 Seminario de Bases de Datos 18

Java desde afuera de Oracle


Desde un programa Java independiente. Mediante el uso de JDBC: Conjunto de clases Java que permiten la interaccin con la base de datos.

Procedimiento: - Crear el siguiente cdigo en un editor de Java y compilarlo (por ejemplo en el JCreator) - El archivo nombrarlo conexion.java JDBC= Java DataBase Connection

13/01/08

Seminario de Bases de Datos

19

Java desde afuera de Oracle


import java.sql.*; import java.math.*; class conexion { static public void main( String[] args ) { Connection conn; Statement sentencia; ResultSet resultado;

System.out.println( "Conexin a la base de datos..." );

Contina
13/01/08 Seminario de Bases de Datos 20

Java desde afuera de Oracle


try{ // Se carga el driver JDBC-ODBC Class.forName ("oracle.jdbc.driver.OracleDriver"); } catch( Exception e ) { System.out.println( "No se pudo cargar el driver JDBC"); return; } try{ // Se establece la conexin con la base de datos conn = DriverManager.getConnection ("jdbc:oracle:thin:@200.24.8.35:1521:xue", "usuario", "password"); sentencia = conn.createStatement(); } catch( SQLException e ) { System.out.println( "No hay conexin con la base de datos." ); return; }

Contina
13/01/08 Seminario de Bases de Datos 21

Java desde afuera de Oracle


try { System.out.println( "Seleccionando..." ); resultado = sentencia.executeQuery ("SELECT codigo,nom,salario FROM empleado"); //Se recorren las tuplas retornadas while (resultado.next()) { System.out.println(resultado.getInt("codigo")+ "---" + resultado.getString("nom")+ "---" + resultado.getInt("salario")); }

Contina
13/01/08 Seminario de Bases de Datos 22

Java desde afuera de Oracle


conn.close(); //Cierre de la conexin } catch( SQLException e ){ System.out.println("Error: " + e.getMessage()); } System.out.println("Consulta finalizada."); } //Fin del main } //Fin de la clase

Fin del cdigo


13/01/08 Seminario de Bases de Datos 23

Java desde afuera de Oracle

Compilar (Con el JCreator use por ejemplo el men Build y la opcion Compile File) Para ejecutar utilice la opcion Execute File del mismo men El resultado en pantalla debe ser:
Conexin a la base de datos... SELECCIONANDO... 10---Luis---100 22---Lisa---200 33---Casandra---300 Consulta finalizada.
13/01/08 Seminario de Bases de Datos 24

Java desde afuera de Oracle

Para que el programa Java accese a la base de datos, se debe adicionar a Java una librera especial ("driver" para Oracle) Se puede bajar del sitio de Oracle: http://otn.oracle.com , tambin est en la pgina del curso El driver debe ser ubicado en el directorio c:\java\jre\lib\ext En general all se colocan las libreras adicionales que se deseen incorporar a Java.

java es el nombre del directorio donde est instalado java


13/01/08 Seminario de Bases de Datos 25

Java desde afuera de Oracle

Otra opcin es: Colocar el driver en el mismo directorio donde est el archivo conexin.class Ahora desde DOS situarse en dicho directorio y ejecutar:
java -classpath classes129i.zip; conexion

Driver
13/01/08 Seminario de Bases de Datos 26

Java desde afuera de Oracle


Cmo se mapean algunos tipos de datos de Oracle a Java: CHAR VARCHAR VARCHAR2 NUMBER DATE VARRAY o tabla anidada Tipo de dato del usuario

String String String java.Math.BigDecimal java.sql.TimeStamp ARRAY STRUCT

13/01/08

Seminario de Bases de Datos

27

Java desde afuera de Oracle


Desde Java es posible:

10

Crear Destruir Actualizar Borrar Ejecutar etc.

Tablas, tipos, vistas etc.

Objetos en la base de datos

Veamos el siguiente ejemplo donde se crea un VARRAY de nmeros:


13/01/08 Seminario de Bases de Datos 28

Java desde afuera de Oracle


import java.sql.*; import java.math.*; class crea_varray { static public void main(String[] args ) { Connection conn; Statement stmt; ResultSet resultado; System.out.println( "Conexin a la base de datos..." ); // Se carga el driver JDBC-ODBC try { Class.forName("oracle.jdbc.driver.OracleDriver"); }
13/01/08 Seminario de Bases de Datos

11

29

Java desde afuera de Oracle


catch(Exception e ) { System.out.println("No se pudo cargar el driver JDBC" ); return; } try { // Se establece la conexin con la base de datos conn = DriverManager.getConnection
("jdbc:oracle:thin:@200.24.8.35:1521:xue", "usuario", "password");

12

stmt = conn.createStatement(); } catch( SQLException e ) { System.out.println("No hay conexin con la base de datos."); return; }

13/01/08

Seminario de Bases de Datos

30

Java desde afuera de Oracle


try {
System.out.println( "Creando objetos en la BD..." ); stmt.execute("CREATE TYPE num_varray AS VARRAY(10) OF NUMBER(4,2)"); stmt.execute("CREATE TABLE varray_table(cod varchar2(8), notas num_varray)"); stmt.execute("INSERT INTO varray_table VALUES(100, num_varray(3,4))"); stmt.execute("INSERT INTO varray_table VALUES(200, num_varray(2,5,3))"); conn.close(); } catch( SQLException e ) { System.out.println("Error " + e.getMessage()); return; } System.out.println( "Creacin de objetos finalizada." ); } }

13

13/01/08

Seminario de Bases de Datos

31

Vous aimerez peut-être aussi