La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

13/01/08Seminario de Bases de Datos1 Oracle y Java * * Tomado del curso de Francisco Moreno.

Presentaciones similares


Presentación del tema: "13/01/08Seminario de Bases de Datos1 Oracle y Java * * Tomado del curso de Francisco Moreno."— Transcripción de la presentación:

1 13/01/08Seminario de Bases de Datos1 Oracle y Java * * Tomado del curso de Francisco Moreno

2 13/01/08Seminario de Bases de Datos2 Formas de comunicación entre Java y Oracle 1 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"

3 13/01/08Seminario de Bases de Datos3 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 Formas de comunicación entre Java y Oracle 2

4 13/01/08Seminario de Bases de Datos4 Java dentro de Oracle 1 Ejecutar en SQL*Plus el siguiente código: 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; } }; /

5 13/01/08Seminario de Bases de Datos5 Adicionalmente se debe crear una función wrapper (de envoltura) que lo que hace es asociar una función de Oracle con un método de la clase Java: Ejecutar en SQL*Plus: CREATE OR REPLACE FUNCTION saludo(nom VARCHAR2) RETURN VARCHAR2 AS LANGUAGE JAVA NAME ' prueba.Hello (java.lang.String) return java.lang.String ' ; / Java dentro de Oracle 2 Función wrapper

6 13/01/08Seminario de Bases de Datos6 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, ' María ' ); Java dentro de Oracle 3

7 13/01/08Seminario de Bases de Datos7 Java dentro de Oracle 4 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 loadjava desde la línea de comando (DOS, UNIX etc.) así: * Aunque existen programas que permiten obtener el código fuente desde un.class como Decafe Pro el código fuente desde un.class como Decafe Pro

8 13/01/08Seminario de Bases de Datos8 Java dentro de Oracle 5 Abrir cualquier editor de Java (JCreator, Java Editor, Kawa etc.) compilar el siguiente código 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; } };

9 13/01/08Seminario de Bases de Datos9 Java dentro de Oracle 6 Si la compilación es exitosa, se debe generar el archivo prueba2.class,cargarlo a Oracle desde DOS usando el comando: 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… Nombre de la BD

10 13/01/08Seminario de Bases de Datos10 Java dentro de Oracle 7 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;

11 13/01/08Seminario de Bases de Datos11 Java dentro de Oracle 8 Ahora veamos un ejemplo más complejo: Vamos a ejecutar en SQL*Plus el siguiente código: 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.*; Continúa

12 13/01/08Seminario de Bases de Datos12 Java dentro de Oracle 9 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 código

13 13/01/08Seminario de Bases de Datos13 Java dentro de Oracle 10 Crear adicionalmente por medio de SQL*Plus: CREATE OR REPLACE TYPE emple_type AS OBJECT( codigo NUMBER(4), nom VARCHAR2(10), salario NUMBER(6), comision NUMBER(6) ); / DROP TABLE empleado; CREATE TABLE empleado OF emple_type ( codigo PRIMARY KEY, salario NOT NULL ); [0] [1] [2] [3] Desde el punto de vista de Java este es el orden de los atributos en Object

14 13/01/08Seminario de Bases de Datos14 Java dentro de Oracle 11 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 función 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 ' ; /

15 13/01/08Seminario de Bases de Datos15 Java dentro de Oracle 12 Ahora: SELECT ' El salario total del empleado con cédula ' || TO_CHAR(codigo) || ' es: ' || sal_tot(VALUE(e)) FROM empleado e; ¡Se le está pasando a Java el objeto de Oracle completo!

16 13/01/08Seminario de Bases de Datos16 Java dentro de Oracle 13 Un método de un tipo puede "prácticamente" ser implementado en Java: Crear el siguiente Código 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); } /

17 13/01/08Seminario de Bases de Datos17 Java dentro de Oracle 14 CREATE OR REPLACE FUNCTION cuadradojava(n IN NUMBER) RETURN NUMBER AS LANGUAGE JAVA NAME 'num.square(java.math.BigDecimal) return java.math.BigDecimal'; / Creación del tipo: DROP TYPE numero_tip FORCE; CREATE TYPE numero_tip AS OBJECT ( numero NUMBER(6), MEMBER FUNCTION cuadrado(n IN number) RETURN NUMBER ); / Función de mapeo (Wrapper):

18 13/01/08Seminario de Bases de Datos18 Java dentro de Oracle 15 Creación 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; END; / Creación de tabla e invocación del método: CREATE TABLE numeros OF numero_tip; INSERT INTO numeros VALUES(3); INSERT INTO numeros VALUES(9); SELECT numero, l.cuadrado(numero) FROM numeros l; Se invoca a la función Wrapper

19 13/01/08Seminario de Bases de Datos19 Java desde afuera de Oracle 1 Desde un programa Java independiente. Mediante el uso de JDBC: Conjunto de clases Java que permiten la interacción con la base de datos. Procedimiento: - Crear el siguiente código en un editor de Java y compilarlo (por ejemplo en el JCreator) - El archivo nombrarlo conexion.java JDBC= Java DataBase Connection

20 13/01/08Seminario de Bases de Datos20 Java desde afuera de Oracle 2 import java.sql.*; import java.math.*; class conexion { static public void main( String[] args ) { Connection conn; Statement sentencia; ResultSet resultado; System.out.println( "Conexión a la base de datos..." ); Continúa

21 13/01/08Seminario de Bases de Datos21 Java desde afuera de Oracle 3 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 conexión 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 conexión con la base de datos." ); return; } Continúa

22 13/01/08Seminario de Bases de Datos22 Java desde afuera de Oracle 4 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")); } Continúa

23 13/01/08Seminario de Bases de Datos23 Java desde afuera de Oracle 5 conn.close(); //Cierre de la conexión } catch( SQLException e ){ System.out.println("Error: " + e.getMessage()); } System.out.println("Consulta finalizada."); } //Fin del main } //Fin de la clase Fin del código

24 13/01/08Seminario de Bases de Datos24 Java desde afuera de Oracle 6 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: Conexión a la base de datos... SELECCIONANDO... 10---Luis---100 22---Lisa---200 33---Casandra---300 Consulta finalizada.

25 13/01/08Seminario de Bases de Datos25 Java desde afuera de Oracle 7 Para que el programa Java accese a la base de datos, se debe adicionar a Java una librería especial ("driver" para Oracle) Se puede bajar del sitio de Oracle: http://otn.oracle.com, también está en la página del curso El driver debe ser ubicado en el directorio c:\java\jre\lib\ext En general allí se colocan las librerías adicionales que se deseen incorporar a Java. java es el nombre del directorio donde está instalado java

26 13/01/08Seminario de Bases de Datos26 Java desde afuera de Oracle 8 Otra opción es: Colocar el driver en el mismo directorio donde está el archivo conexión.class Ahora desde DOS situarse en dicho directorio y ejecutar: java -classpath classes129i.zip; conexion Driver

27 13/01/08Seminario de Bases de Datos27 Java desde afuera de Oracle 9 CHAR VARCHAR VARCHAR2 NUMBER DATE VARRAY o tabla anidada Tipo de dato del usuario String java.Math.BigDecimal java.sql.TimeStamp ARRAY STRUCT Cómo se mapean algunos tipos de datos de Oracle a Java:

28 13/01/08Seminario de Bases de Datos28 Java desde afuera de Oracle 10 Desde Java es posible: Crear Destruir Actualizar Borrar Ejecutar etc. Veamos el siguiente ejemplo donde se crea un VARRAY de números: Objetos en la base de datos Tablas, tipos, vistas etc.

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

30 13/01/08Seminario de Bases de Datos30 Java desde afuera de Oracle 12 catch(Exception e ) { System.out.println("No se pudo cargar el driver JDBC" ); return; } try { // Se establece la conexión con la base de datos conn = DriverManager.getConnection ("jdbc:oracle:thin:@200.24.8.35:1521:xue", "usuario", "password"); stmt = conn.createStatement(); } catch( SQLException e ) { System.out.println("No hay conexión con la base de datos."); return; }

31 13/01/08Seminario de Bases de Datos31 Java desde afuera de Oracle 13 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( "Creación de objetos finalizada." ); }


Descargar ppt "13/01/08Seminario de Bases de Datos1 Oracle y Java * * Tomado del curso de Francisco Moreno."

Presentaciones similares


Anuncios Google