Oracle y Java Continuación *

Slides:



Advertisements
Presentaciones similares
FUNDAMENTALS OF THE JAVA PROGRAMMING LANGUAGE
Advertisements

FUNDAMENTALS OF THE JAVA PROGRAMMING LANGUAGE
Composición de Una Tabla de Números a Partir de Una Lista de Números Separada por Comas en Transact SQL Leonel Morales Díaz Ingeniería Simple
Acceso a Bases de Datos con Java
Fernando Alonso Blázquez Servlets con acceso a Bases de Datos 29 de Abril de 2004.
Delete en tablas: titulacion. Puedo eliminar cualquier fila de una tabla? Restriccion de integridad: Restrict/Cascade.
Introducción a JAVA COMP 250. Estructura de Selección selection statements selection statements – Escoger cuál acción ejecutar dependiendo de dos ó más.
BASE DE DATOS OBJETO RELACIONAL
Esquema de Mapeo de Base de Datos Relacionales a Objetos
Spatial Database Bases de Datos Espaciales MOTORES COMERCIALES Oracle Spatial.
SQL Server 2005 ADO.NET Javier Fernández Rodríguez Noviembre 2005, Sevilla Javier Fernández Rodríguez Noviembre 2005, Sevilla.
Entrada y salida Fundamentos de programación/Programación I
Procedimientos Almacenados y Disparadores
PL/SQL Francisco Moreno Universidad Nacional. Funciones Si un procedimiento tiene solo un parámetro de salida, se puede remplazar por una función y esta.
Defina una clase TempMinMaxEst que encapsule la representación de las temperaturas mínimas y máximas registradas en una estación meteorológica y brinde.
ACCESO A BASES DE DATOS ORACLE CON PHP
JDBC Acceso a B.B.D.D. con Java.
Programador en Plataforma Java y XML
Proyecto DE BASE DE DATOS
01/12/07Seminario de Bases de Datos1 Características Objeto Relacionales en Oracle 10G* * Tomado del curso de Francisco Moreno.
13/01/08Seminario de Bases de Datos1 Oracle y Java * * Tomado del curso de Francisco Moreno.
25/11/07Laboratorio de Bases de Datos1 PL/SQL* *Tomado del curso de Francisco Moreno.
01/12/07Seminario de Bases de Datos1 Características Objeto Relacionales en Oracle 10G* * Tomado del curso de Francisco Moreno.
11/06/201424/11/06Lab. Bases de Datos1 JSP y Bases de Datos * * Tomado del curso de Francisco Moreno.
INFORMATICA I Funciones CLASE 13.
UNIVERSIDAD LATINA (UNILA) VI.- ARCHIVOS Y BASES DE DATOS
Seminario de Lenguajes A – Opción Ada
Características Objeto Relacionales en Oracle
Francisco Moreno Bases de Datos II Universidad Nacional
Características Objeto Relacionales en Oracle
PL/SQL Francisco Moreno Universidad Nacional.
BASES DE DATOS Ejercicio No. 6. Ejecutar las siguientes sentencias SELECT nombre, ueldo FROM user.tabla_profesor WHERE filtro 1 UPDATE user.tabla_profesor.
Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional.
Características Objeto Relacionales en Oracle
Lenguaje Estructurado de Consultas (Structured Query Language – SQL)
/*Desarrollar una solución que permita ingresar y almacenar el promedio de prácticas, la nota del examen parcial y la nota del examen final de todos.
Método en Java.
M.I. María Luisa González Ramírez Servlets y JSP.
Recursión Se dice que un método es recursivo si forma parte de sí mismo o se define en función de sí mismo. La recursión es un medio particularmente poderoso.
Tema 3 J2EE Java Database Connectivity Temas Selectos de Cómputo Grupo 912.
Introducción a la Programación Orientada a Objetos Redefinición y Sobrecarga Dada la siguiente jerarquía de clases: Alfa Delta Beta.
Realizado por: Bertha Palomeque A. Rodrigo Barzola J. Sensor de Temperatura utilizando el Starter Kit Javelin Stamp.
RMI JAVA Implementación.
Métodos Algoritmos y Desarrollo de Programas I. Cuando utilizar métodos  Los métodos se utilizan para romper un problema en pedazos de forma que este.
0. Desarrollo de Programas: técnica del refinamiento.
PL/SQL Francisco Moreno Universidad Nacional.
Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional.
If anidados y Switch Prof. Lillian Bras.
Public class MiClase { public static int tmp = 123; // miembro variable public static final double PI = ;// miembro constante public float.
1 Ingeniería del Software Ejercicios de Implementación  Caso de Uso Total Gasto (Junio 2003)  Caso de Uso Mejor Usuario (Septiembre 2003)  Caso de Uso.
Colecciones.
ARCHIVOS Y CONEXIÓN A BASE DE DATOS. FileInputStream: Clase que representa ficheros de texto accedidos en orden secuencial, byte a byte. FileWriter: Clase.
Suponiendo que además en la clase U hay: import java.util.*; class U{ static Scanner teclado = new Scanner(System.in); static public int readInt(String.
Programación III Clase 06 Funciones.
3.  Recursividad.
Fernando Alonso Nicolás Serrano Acceso a Bases de Datos con Java JDBC 01 de Abril de 2008.
Programación Orientada a Objetos II
JDBC Java Database Connectivity CC52N - Computación para el trabajo grupal Profesor: Nélson Baloian Por: Edgard Pineda.
1 Programación Interactiva JDBC Escuela de Ingeniería de Sistemas y Computación Facultad de Ingeniería Universidad del Valle.
Java Data Base Connectivity
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) cec.uchile.cl Módulo ECI - 11: Fundamentos de Redes de Computadores.
ARREGLOS. La sintaxis para declarar e inicializar un array será: Tipo_de_variable[ ] Nombre_del_array = new Tipo_de_variable[dimensión]; También podemos.
JDBC. Definición Java Database Conectivity El acceso a bases de datos JDBC implica abrir una conexión ejecutar comandos SQL en un sentencia procesar los.
Crear Aplicación Cliente para Conectarse a una Base de Datos.
Francisco Moreno Bases de Datos II Universidad Nacional
Conferencia 9. ODBC, OLE DB y JDBC.
Características Objeto Relacionales en Oracle
BASE DE DATOS IUPSM CLASE PRACTICA. PROF. ING. JOSE L GUZMAN H.
JDBC: comunicación Java-Base de Datos
Transcripción de la presentación:

Oracle y Java Continuación * * Tomado del curso de Francisco Moreno 13/01/08 Seminario de Bases de Datos

Consultando un VARRAY de números desde Java Previamente se ha creado una tabla cuya estructura es: CREATE TYPE num_varray AS VARRAY(10) OF NUMBER(4,2); CREATE TABLE varray_table( cod VARCHAR2(8),notas num_varray); INSERT INTO varray_table VALUES(100, num_varray(3,4)); VALUES(200, num_varray(2,5,3)); 13/01/08 Seminario de Bases de Datos

Seminario de Bases de Datos import java.sql.*; import java.math.*; import oracle.sql.*; //Requiere el driver de Oracle import oracle.jdbc.driver.*; // Requiere el driver de Oracle class consulta_varray { static public void main(String[] args) Connection conn; Statement stmt; ResultSet resultado; System.out.println( "Intentando conexión a la bd..." ); Continúa 13/01/08 Seminario de Bases de Datos

Seminario de Bases de Datos try { // Se carga el driver JDBC-ODBC Class.forName ("oracle.jdbc.driver.OracleDriver"); } catch( Exception e ) { System.out.println("No hay driver JDBC" ); return; } try { // Se establece conexion con la base de datos conn = DriverManager.getConnection( "jdbc:oracle:thin:@200.24.8.35:1521:xue", "user", "password"); stmt = conn.createStatement(); Continúa 13/01/08 Seminario de Bases de Datos

Seminario de Bases de Datos catch( SQLException e ) { System.out.println( "No se pudo conectar con la base de datos." ); return; } try { System.out.println( "Consultando notas..."); resultado = stmt.executeQuery("SELECT * FROM varray_table"); CHAR ced; //Alternativa a String, pero exclusivo para Oracle ARRAY mi_array; BigDecimal out_value; BigDecimal[] values; Continúa 13/01/08 Seminario de Bases de Datos

Seminario de Bases de Datos while (resultado.next())‏ { ced= (CHAR)((OracleResultSet)resultado).getOracleObject(1); System.out.println("Notas del estudiante con código " + ced); mi_array = ((OracleResultSet)resultado).getARRAY(2); values = (BigDecimal[]) mi_array.getArray(); for(int i=0; i<values.length; i++)‏ out_value = (BigDecimal) values[i]; System.out.println("Nota nro " + (i+1) + " " + out_value.intValue()); } Continúa 13/01/08 Seminario de Bases de Datos

Seminario de Bases de Datos conn.close(); }catch( SQLException e ) { System.out.println("Se produjo el error " + e.getMessage()); return; } System.out.println("Consulta finalizada." ); Fin 13/01/08 Seminario de Bases de Datos

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

Creando y Consultando una tabla anidada de objetos Se van a crear desde Java los siguientes objetos: Tipo dir_type con atributos tel NUMBER(8)‏ dir VARCHAR2(10)‏ Tipo de tabla anidada de dir_type contacto_list Tabla estudiante con columnas ced VARCHAR2(8)‏ contactos contacto_list Y se insertarán algunas filas… Clave Primaria 13/01/08 Seminario de Bases de Datos

Seminario de Bases de Datos Estudiante Las tablas anidadas al igual que los VARRAYs se mapean al tipo ARRAY En este caso para el manejo de cada uno de los contactos (dir_type) se necesitará adicionalmente trasformar el ARRAY en un tipo Datum ced contactos Av 8 12 Cl 4 101 10 Av 3 42 Cl 9 201 20 13/01/08 Seminario de Bases de Datos

Seminario de Bases de Datos import java.sql.*; import java.math.*; import oracle.sql.*; import oracle.jdbc.driver.*; class tab_anidada { static public void main( String[] args ) Connection conn; Statement sentencia; ResultSet resultado; System.out.println("Intentando conexión a la bd..." ); 13/01/08 Seminario de Bases de Datos

Seminario de Bases de Datos 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 conexion con la base de datos conn = DriverManager.getConnection ("jdbc:oracle:thin:@200.24.8.35:1521:xue", "user", "password"); sentencia = conn.createStatement(); } catch( SQLException e ) { System.out.println( "No hay conexion con la base de datos." ); 13/01/08 Seminario de Bases de Datos

Seminario de Bases de Datos System.out.println("Creando objetos..."); try{ sentencia.execute("CREATE TYPE dir_type AS OBJECT(tel NUMBER(8), dir VARCHAR2(10))"); } catch( SQLException e ){ System.out.println("Tipo dir_type ya creado" );} try{ sentencia.execute("CREATE TYPE contacto_list AS TABLE OF dir_type"); } System.out.println("Tipo contacto ya creado" );} try{ sentencia.execute("CREATE TABLE estudiante (ced VARCHAR2(8) PRIMARY KEY, contactos contacto_list) NESTED TABLE contactos STORE AS nestels"); } System.out.println("Tabla estudiante ya creada" );} 13/01/08 Seminario de Bases de Datos

Seminario de Bases de Datos try{ sentencia.execute("INSERT INTO estudiante VALUES(10, contacto_list(dir_type(101, 'cl 4'), dir_type(12, 'av 8')))"); sentencia.execute("INSERT INTO estudiante VALUES(20, contacto_list(dir_type(201, 'cl 9'), dir_type(42, 'av 3')))"); }catch( SQLException e ){ System.out.println("Tabla estudiante ya creada" );} System.out.println("Consultando...cedulas y telefonos de cada estudiante" ); resultado = sentencia.executeQuery("SELECT * FROM estudiante"); ARRAY mi_array; String cedula; Datum[] values; 13/01/08 Seminario de Bases de Datos

Seminario de Bases de Datos while (resultado.next())‏ { cedula = resultado.getString(1); mi_array = ((OracleResultSet)resultado).getARRAY(2); System.out.println("Los teléfonos del estudiante con cédula "+ cedula + " son:"); values = (Datum[]) mi_array.getOracleArray(); Object[] attribs; STRUCT out_value; for(int i=0;i<values.length;i++){ out_value = (STRUCT) values[i]; attribs = out_value.getAttributes(); System.out.println("Tel " + (i+1) + "= " + attribs[0]); } 13/01/08 Seminario de Bases de Datos

Seminario de Bases de Datos } catch( SQLException e ) { System.out.println("se produjo elerror " + e.getMessage()); return; } System.out.println("Consulta finalizada."); 13/01/08 Seminario de Bases de Datos

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

Ejecutando una función PL/SQL desde Java ¿Cómo enviar parámetros y cómo recibir el resultado? (tanto de la función como de parámetros de retorno: OUT)‏ Se definirá una función escrita en PL/SQL la cual devuelve una cadena de caracteres y tiene 2 parámetros: -Uno de entrada, de tipo VARCHAR -Uno de salida, de tipo DATE 13/01/08 Seminario de Bases de Datos

Seminario de Bases de Datos Se invocará desde Java mediante un bloque anónimo Begin llamado_función End; Para ello se usará el objeto: OracleCallableStatement Luego se recibirá el resultado y se imprimirá desde Java por pantalla Inicialmente se crea la función directamente en SQL*Plus, luego se verá cómo incluso puede ser creada dinámicamente desde Java 13/01/08 Seminario de Bases de Datos

Seminario de Bases de Datos CREATE OR REPLACE FUNCTION saludo (nom IN VARCHAR2, fecha OUT DATE)‏ RETURN VARCHAR2 IS cadena VARCHAR2(20); BEGIN fecha := SYSDATE; cadena := 'Hola ' || nom; RETURN cadena; END; / 13/01/08 Seminario de Bases de Datos

Seminario de Bases de Datos import java.sql.*; import java.math.*; import oracle.sql.*; import oracle.jdbc.driver.*; class llamafunc { static public void main( String[] args ) Connection conn; Statement stmt; ResultSet resultado; System.out.println("Intentando conexión a la bd..." ); 13/01/08 Seminario de Bases de Datos

Seminario de Bases de Datos 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 conexion con la base de datos conn = DriverManager.getConnection ("jdbc:oracle:thin:@200.24.8.35:1521:xue","user", "password"); stmt = conn.createStatement(); } catch( SQLException e ) { System.out.println( "No hay conexión con la base de datos." ); 13/01/08 Seminario de Bases de Datos

Seminario de Bases de Datos try { //Se prepara el llamado y los parámetros System.out.println( "Invocando una función con parámetros de envio y retorno..." ); OracleCallableStatement cstmt = (OracleCallableStatement)conn.prepareCall ("begin ? := saludo(?,?); end;"); cstmt.registerOutParameter(1,Types.CHAR); cstmt.setString(2,"Jhonny"); cstmt.registerOutParameter(3,Types.DATE); 13/01/08 Seminario de Bases de Datos

Seminario de Bases de Datos // Se ejecuta el llamado a la función y se recogen los resultados cstmt.execute(); CHAR mensaje = (CHAR)((OracleCallableStatement)cstmt).getOracleObject(1); Timestamp hoy = (Timestamp) ((CallableStatement)cstmt).getObject(3); System.out.println(mensaje + " la fecha del dia de hoy es: " + hoy); conn.close(); } catch( SQLException e ) { System.out.println("Se produjo el siguiente error " + e.getMessage()); return; } System.out.println("Funcion ejecutada" ); 13/01/08 Seminario de Bases de Datos

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

Seminario de Bases de Datos Ahora se creará la función dinámicamente : Agregar el siguiente código al programa anterior inmediatamente antes de: //Se prepara el llamado y los parámetros System.out.println("Se creará la función dinámicamente"); String f; f = "BEGIN EXECUTE IMMEDIATE 'CREATE OR REPLACE FUNCTION saludo"; f = f + "(nom IN VARCHAR, fecha OUT DATE)"; f = f + "RETURN VARCHAR2 IS "; f = f + "cadena VARCHAR2(20);"; f = f + "BEGIN"; f = f + " fecha := SYSDATE;"; f = f + " cadena := ''Hola Don '' || nom;"; f = f + " RETURN cadena;"; f = f + "END;'; END;"; //System.out.println( f); OracleCallableStatement cstmt2 = (OracleCallableStatement)conn.prepareCall(f); cstmt2.execute(); Ojo: Son 2 comillas simples seguidas 13/01/08 Seminario de Bases de Datos

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

Seminario de Bases de Datos También se puede llamar una función de envoltura…por ejemplo: CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "numero_java" AS import java.math.*; public class numero_java { public static BigDecimal factorial(BigDecimal n){ if (n.compareTo(new BigDecimal(0))==0)return new BigDecimal(1); else return n.multiply(factorial(n.subtract(new BigDecimal(1)))); } }; / CREATE OR REPLACE FUNCTION fact(n NUMBER)‏ RETURN NUMBER AS LANGUAGE JAVA NAME 'numero_java.factorial (java.math.BigDecimal) return java.math.BigDecimal'; Ojo: En la función de envoltura debe especificarse la jerarquía completa del tipo (BigDecimal)‏ 13/01/08 Seminario de Bases de Datos

Seminario de Bases de Datos import java.sql.*; import java.math.*; class llamafact { static public void main( String[] args ) { Connection c; Statement s;ResultSet r; try{ Class.forName ("oracle.jdbc.driver.OracleDriver"); }catch(Exception e ){ System.out.println("No driver");return;} try{ c = DriverManager.getConnection ("jdbc:oracle:thin:@200.24.8.35:1521:xue","user", "pass"); s = c.createStatement(); }catch(SQLException e){ System.out.println("Sin conexión");return;} try{ r = s.executeQuery ("SELECT fact(4) AS mifact FROM dual"); while (r.next()) System.out.println(r.getInt("mifact")); c.close(); }catch( SQLException e ){ System.out.println(e.getMessage());} } 13/01/08 Seminario de Bases de Datos

Seminario de Bases de Datos Lo que significa que al invocar desde Java a esta función se está llamando a un método de una clase Java construida dentro de Oracle, la cual igualmente podría ser construida dinámicamente desde el programa Java externo… Al igual que con Java es posible accesar la base de datos Oracle (y en general cualquier SGBD) con otros lenguajes, por ejemplo PHP, C++, Visual Basic etc…y el mecanismo de conectividad y manipulación es similar El próximo paso es llevar los resultados a la web los cuales serán visualizados en un navegador (Internet Explorer, Firefox, etc.)‏ 13/01/08 Seminario de Bases de Datos