Download Oracle y Java
Document related concepts
no text concepts found
Transcript
Oracle y Java * * Tomado del curso de Francisco Moreno 13/01/08 Seminario de Bases de Datos 1 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" 13/01/08 Seminario de Bases de Datos 2 Formas de comunicación entre Java y Oracle 2 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 3 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; } }; / 13/01/08 Seminario de Bases de Datos 4 Java dentro de Oracle 2 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: Función 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 5 Java dentro de Oracle 3 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'); 13/01/08 Seminario de Bases de Datos 6 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 13/01/08 Seminario de Bases de Datos 7 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; } }; 13/01/08 Seminario de Bases de Datos 8 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: 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 9 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; 13/01/08 Seminario de Bases de Datos 10 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 13/01/08 Seminario de Bases de Datos 11 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/01/08 Seminario de Bases de Datos 12 Java dentro de Oracle 10 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) ); / Desde el punto de vista de Java este es el orden de los atributos en Object DROP TABLE empleado; CREATE TABLE empleado OF emple_type ( codigo PRIMARY KEY, salario NOT NULL ); 13/01/08 Seminario de Bases de Datos 13 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'; / 13/01/08 Seminario de Bases de Datos 14 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! 13/01/08 Seminario de Bases de Datos 15 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); } } / 13/01/08 Seminario de Bases de Datos 16 Java dentro de Oracle 14 Función 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'; / 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 ); / 13/01/08 Seminario de Bases de Datos 17 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; Se invoca a la función Wrapper 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; 13/01/08 Seminario de Bases de Datos 18 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 13/01/08 Seminario de Bases de Datos 19 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 13/01/08 Seminario de Bases de Datos 20 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 13/01/08 Seminario de Bases de Datos 21 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 13/01/08 Seminario de Bases de Datos 22 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 13/01/08 Seminario de Bases de Datos 23 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. 13/01/08 Seminario de Bases de Datos 24 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 13/01/08 Seminario de Bases de Datos 25 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 13/01/08 Seminario de Bases de Datos 26 Java desde afuera de Oracle 9 Cómo se mapean algunos tipos de datos de Oracle a Java: CHAR VARCHAR VARCHAR2 NUMBER DATE VARRAY o tabla anidada Tipo de dato del usuario 13/01/08 String String String java.Math.BigDecimal java.sql.TimeStamp ARRAY STRUCT Seminario de Bases de Datos 27 Java desde afuera de Oracle 10 Desde Java es posible: 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 números: 13/01/08 Seminario de Bases de Datos 28 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"); } 13/01/08 Seminario de Bases de Datos 29 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; } 13/01/08 Seminario de Bases de Datos 30 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." ); } } 13/01/08 Seminario de Bases de Datos 31