+ All Categories
Home > Documents > Oracle y Java

Oracle y Java

Date post: 04-Aug-2015
Category:
Upload: davis-fernando-cardona-vasquez
View: 45 times
Download: 0 times
Share this document with a friend
Popular Tags:
31
13/01/08 Seminario de Bases de Dat os 1 Oracle y Java * * Tomado del curso de Francisco Moreno
Transcript
Page 1: Oracle y Java

13/01/08 Seminario de Bases de Datos 1

Oracle y Java *

* Tomado del curso de Francisco Moreno

Page 2: Oracle y Java

13/01/08 Seminario de Bases de Datos 2

Formas de comunicación entre Java y Oracle1

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"

Page 3: Oracle y Java

13/01/08 Seminario de Bases de Datos 3

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 Oracle2

Page 4: Oracle y Java

13/01/08 Seminario de Bases de Datos 4

Java dentro de Oracle1

Ejecutar en SQL*Plus el siguiente código:

CREATE OR REPLACE AND COMPILE JAVA SOURCENAMED "prueba" ASpublic class prueba { public static String Hello(String cadena) { return "Bienvenido a Java con Oracle " + cadena; }};/

Page 5: Oracle y Java

13/01/08 Seminario de Bases de Datos 5

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) returnjava.lang.String';/

Java dentro de Oracle2

Función wrapper

Page 6: Oracle y Java

13/01/08 Seminario de Bases de Datos 6

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 Oracle3

Page 7: Oracle y Java

13/01/08 Seminario de Bases de Datos 7

Java dentro de Oracle4

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 * Aunque existen programas que permiten obtener permiten obtener el código fuente desde un .class como el código fuente desde un .class como Decafe ProDecafe Pro

Page 8: Oracle y Java

13/01/08 Seminario de Bases de Datos 8

Java dentro de Oracle5

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; }};

Page 9: Oracle y Java

13/01/08 Seminario de Bases de Datos 9

Java dentro de Oracle6

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

Page 10: Oracle y Java

13/01/08 Seminario de Bases de Datos 10

Java dentro de Oracle7

Ahora en Oracle:(SQL*Plus)

CREATE OR REPLACE FUNCTION saludo2(nom VARCHAR2)RETURN VARCHAR2 AS LANGUAGE JAVA NAME'prueba2.Hello (java.lang.String) returnjava.lang.String';/

SELECT cedula, saludo(nombre), saludo2(nombre)FROM estudiante;

Page 11: Oracle y Java

13/01/08 Seminario de Bases de Datos 11

Java dentro de Oracle8

Ahora veamos un ejemplo más complejo:Vamos a ejecutar en SQL*Plus el siguiente código:

CREATE OR REPLACE AND COMPILE JAVA SOURCENAMED "Paymaster" ASimport java.sql.*;import java.io.*;import oracle.sql.*;import oracle.jdbc.driver.*;import java.math.*;

Continúa

Page 12: Oracle y Java

13/01/08 Seminario de Bases de Datos 12

Java dentro de Oracle9

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

Page 13: Oracle y Java

13/01/08 Seminario de Bases de Datos 13

Java dentro de Oracle10

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

Page 14: Oracle y Java

13/01/08 Seminario de Bases de Datos 14

Java dentro de Oracle11

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';/

Page 15: Oracle y Java

13/01/08 Seminario de Bases de Datos 15

Java dentro de Oracle12

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 ¡Se le está pasando a Java el objeto objeto de Oracle completo!de Oracle completo!

Page 16: Oracle y Java

13/01/08 Seminario de Bases de Datos 16

Java dentro de Oracle13

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 SOURCENAMED "num" ASimport java.math.*;import java.math.BigDecimal;public class num { public static BigDecimal square(BigDecimal n) { return n.multiply(n); }}/

Page 17: Oracle y Java

13/01/08 Seminario de Bases de Datos 17

Java dentro de Oracle14

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):Función de mapeo (Wrapper):

Page 18: Oracle y Java

13/01/08 Seminario de Bases de Datos 18

Java dentro de Oracle15

Creación del cuerpo del tipo:

CREATE OR REPLACE TYPE BODY numero_tip ASMEMBER 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 WrapperSe invoca a la función Wrapper

Page 19: Oracle y Java

13/01/08 Seminario de Bases de Datos 19

Java desde afuera de Oracle1

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 ConnectionJDBC= Java DataBase Connection

Page 20: Oracle y Java

13/01/08 Seminario de Bases de Datos 20

Java desde afuera de Oracle2

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

Page 21: Oracle y Java

13/01/08 Seminario de Bases de Datos 21

Java desde afuera de Oracle3

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

Page 22: Oracle y Java

13/01/08 Seminario de Bases de Datos 22

Java desde afuera de Oracle4

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

Page 23: Oracle y Java

13/01/08 Seminario de Bases de Datos 23

Java desde afuera de Oracle5

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

Page 24: Oracle y Java

13/01/08 Seminario de Bases de Datos 24

Java desde afuera de Oracle6

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---10022---Lisa---20033---Casandra---300Consulta finalizada.

Page 25: Oracle y Java

13/01/08 Seminario de Bases de Datos 25

Java desde afuera de Oracle7

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

Page 26: Oracle y Java

13/01/08 Seminario de Bases de Datos 26

Java desde afuera de Oracle8

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

Page 27: Oracle y Java

13/01/08 Seminario de Bases de Datos 27

Java desde afuera de Oracle9

CHARVARCHARVARCHAR2NUMBERDATEVARRAY o tabla

anidadaTipo de dato del

usuario

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

Cómo se mapean algunos tipos de datos de Oracle a Java:Cómo se mapean algunos tipos de datos de Oracle a Java:

Page 28: Oracle y Java

13/01/08 Seminario de Bases de Datos 28

Java desde afuera de Oracle10

Desde Java es posible:

Crear Destruir Actualizar Borrar Ejecutar etc.

Veamos el siguiente ejemplo donde se crea un VARRAY de números:

ObjetosObjetos en la en la base de datosbase de datos

Tablas, tipos, vistas etc.Tablas, tipos, vistas etc.

Page 29: Oracle y Java

13/01/08 Seminario de Bases de Datos 29

Java desde afuera de Oracle11

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"); }

Page 30: Oracle y Java

13/01/08 Seminario de Bases de Datos 30

Java desde afuera de Oracle12

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; }

Page 31: Oracle y Java

13/01/08 Seminario de Bases de Datos 31

Java desde afuera de Oracle13

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." ); }}


Recommended