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