You are on page 1of 147

DISEO DE BASES DE DATOS OBJETO RELACIONALES

Oracle y Java
Alejandro Apaza Tarqui Universidad Nacional del ALTIPLANO PUNO - PERU apazatarqui@hotmail.com

Bases de Datos Avanzado

Formas de comunicacin entre:


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 2. Por medio de JSP: Se accesa a la base de datos desde Java y los resultados pueden visualizarse por medio de un navegador.

Java y Oracle1

Se requiere para este caso un servidor web (Tomcat, Jrun etc.)


Se comenzar con Java dentro de Oracle

Bases de Datos Avanzado

Ejecutar en SQL*Plus el siguiente cdigo:

Java dentro de Oracle1

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; } }; /
Adicionalmente se debe crear una funcin wrapper (de envoltura) que lo que hace es asociar una funcin de Oracle con un mtodo de la clase Java, ejecutar en SQL*Plus: Funcin wrapper

CREATE OR REPLACE FUNCTION saludo(nom VARCHAR2) RETURN VARCHAR2 AS LANGUAGE JAVA NAME 'prueba.Hello (java.lang.String) return java.lang.String'; / Bases de Datos Avanzado

Java dentro de Oracle3


Para invocarla se hace lo siguiente: DROP TABLE estudiante; CREATE TABLE estudiante( DNI NUMBER(8) PRIMARY KEY, nombre VARCHAR2(15) ); INSERT INTO estudiante VALUES (7173, 'Pedro'); INSERT INTO estudiante VALUES (7178, 'Luis'); INSERT INTO estudiante VALUES (4311, 'Mara'); Ejecutar:
SELECT DNI, 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 lnea de comando (DOS, UNIX etc.) as:
* Aunque existen programas que permiten obtener el cdigo fuente desde un .class como Decafe Pro Bases de Datos Avanzado

Java dentro de Oracle

Abrir cualquier editor de Java (NetBeans, Java Editor, Kawa etc.) compilar el siguiente cdigo 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; } };
Si la compilacin es exitosa, se debe generar el archivo prueba2.class, cargarlo a Oracle desde DOS usando el comando:

loadjava -user username/password prueba2.class


Nota: Antes de ejecutar el comando situarse en el directorio donde Bases de Datos Avanzado est el archivo prueba2.class o darle el camino completo

Ahora en Oracle:(SQL*Plus)

Java dentro de Oracle7

CREATE OR REPLACE FUNCTION saludo2(nom VARCHAR2) RETURN VARCHAR2 AS LANGUAGE JAVA NAME 'prueba2.Hello (java.lang.String) return java.lang.String'; / SELECT DNI, saludo(nombre), saludo2(nombre) FROM estudiante;

Ahora veamos un ejemplo ms complejo: ejecutar en SQL*Plus el siguiente cdigo:


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.*;
Bases de Datos Avanzado

Java dentro de Oracle

public class Paymaster { public static BigDecimal wages(STRUCT e) throws java.sql.SQLException { Object[] attribs = e.getAttributes(); BigDecimal sal = (BigDecimal)(attribs[2]); // [2]
= salario = comisin

BigDecimal comm = (BigDecimal)(attribs[3]);//[3] BigDecimal pay = sal; if (comm != null) pay = pay.add(comm); return pay;

} } /
Bases de Datos Avanzado

Fin del cdigo

Java dentro de Oracle


Crear adicionalmente por medio de SQL*Plus:

10

CREATE OR REPLACE TYPE emple_type AS OBJECT( codigo NUMBER(4), [0] Desde el punto de [1] nom VARCHAR2(10), vista de Java este [2] es el orden de los salario NUMBER(6), atributos en Object [3] comision NUMBER(6) ); / DROP TABLE empleado; CREATE TABLE empleado OF emple_type ( codigo PRIMARY KEY, salario NOT NULL ); INSERT INTO empleado VALUES(10, 'Luis',100, 50); INSERT INTO empleado VALUES(22, 'Lisa', 200, null); INSERT INTO empleado VALUES(33, 'Casandra', 300, 10);
Bases de Datos Avanzado

Java dentro de Oracle

12

Se crea la funcin 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'; /
Ahora: SELECT 'El salario total del empleado con DNI '|| TO_CHAR(codigo) || ' es: '|| sal_tot(VALUE(e)) FROM empleado e; Se le est pasando a Java el objeto de Oracle completo!
Bases de Datos Avanzado

Java dentro de Oracle

13

Un mtodo de un tipo puede "prcticamente" ser implementado en Java: Crear el siguiente Cdigo 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); } Funcin 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'; /
Bases de Datos Avanzado

Java dentro de Oracle


Creacin del tipo:
DROP TYPE numero_tip FORCE; CREATE TYPE numero_tip AS OBJECT ( numero NUMBER(6), MEMBER FUNCTION cuadrado(n IN number) RETURN NUMBER ); /

15

Creacin 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 funcin Wrapper END; /
Bases de Datos Avanzado

Java desde afuera de Oracle


Creacin de tabla e invocacin del mtodo:
CREATE TABLE numeros OF numero_tip; INSERT INTO numeros VALUES(3); INSERT INTO numeros VALUES(9); SELECT numero, l.cuadrado(numero) FROM numeros l;

1.Desde un programa Java independiente. Mediante el uso de JDBC: JDBC= Java DataBase Connection Conjunto de clases Java que permiten la interaccin con la base de datos. Procedimiento: - Crear el siguiente cdigo en un editor de Java y compilarlo (por ejemplo en el NetBeans) - El archivo nombrarlo conexion.java
Bases de Datos Avanzado

import java.sql.*; import java.math.*; Java desde afuera de Oracle2 class conexion { static public void main( String[] args ) { Connection conn; Statement sentencia; ResultSet resultado; System.out.println( "Conexin a la base 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 conexin con la base de datos conn = DriverManager.getConnection ("jdbc:oracle:thin:@apaza:5500:ocrl", "usuario", "password"); sentencia = conn.createStatement(); } catch( SQLException e ) { System.out.println( "No hay conexin con la base de datos." ); Contina return; Bases de Datos Avanzado }

Java desde afuera de Oracle


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")); } conn.close(); //Cierre de la conexin } catch( SQLException e ){ System.out.println("Error: " + e.getMessage()); } System.out.println("Consulta finalizada."); } //Fin del main } //Fin de la clase

Contina
Bases de Datos Avanzado

Java desde afuera de Oracle

Compilar (Con el NetBeans use por ejemplo el men Build y la opcion Compile File) Para ejecutar utilice la opcin Execute File del mismo men El resultado en pantalla debe ser:
Conexin a la base de datos... SELECCIONANDO... 10---Pacho---100 22---Lisa---200 33---Casandra---300 Consulta finalizada.

Para que el programa Java accese a la base de datos, se debe adicionar a Java una librera especial ("driver" para Oracle) Se puede bajar del sitio de Oracle: http://otn.oracle.com , tambin est en la pgina del curso El driver debe ser ubicado en el directorio c:\java\jre\lib\ext En general all se colocan las libreras adicionales que se deseen incorporar a Java.
java es el nombre del directorio donde est instalado java
Bases de Datos Avanzado

Java desde afuera de Oracle

Otra opcin es: Colocar el driver en el mismo directorio donde est el archivo conexin.class Ahora desde DOS situarse en dicho directorio y ejecutar:
java -classpath classes129i.zip; conexin
Driver Cmo se mapean algunos tipos de datos de Oracle a Java:

CHAR VARCHAR VARCHAR2 NUMBER DATE VARRAY o tabla anidada Tipo de dato del usuario

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

Bases de Datos Avanzado

Desde Java es posible: Tablas, tipos, vistas etc. Crear Destruir Actualizar Objetos en la base Borrar de datos Ejecutar etc.

Java desde afuera de Oracle

10

Veamos el siguiente ejemplo donde se crea un VARRAY de nmeros: import java.sql.*; import java.math.*; class crea_varray { static public void main(String[] args ) { Connection conn; Statement stmt; ResultSet resultado; System.out.println( "Conexin a la base de datos..." ); // carga driver JDBC try { Class.forName("oracle.jdbc.driver.OracleDriver"); } Bases de Datos Avanzado

Java desde afuera de Oracle


catch(Exception e ) { System.out.println("No se pudo cargar el driver JDBC" ); return; } try { // Se establece la conexin con la base de datos conn = DriverManager.getConnection
("jdbc:oracle:thin:@apaza:5500:ocrl", "usuario", "passwrod");

12

stmt = conn.createStatement(); } catch( SQLException e ) { System.out.println("No hay conexin con la base de datos."); return; } 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( "Creacin de objetos finalizada." );
} } Bases de Datos Avanzado

VARRAYS (ARRAYs Variables)


Los VARRAYs son el equivalente a los ARRAYs de SQL:2003 Todos los elementos del VARRAY son del mismo tipo* Al igual que las tablas anidadas sus elementos pueden pertenecer a un tipo: - Primitivo - Definido por el usuario - Incluso el de otro VARRAY (VARRAY de VARRAYs etc.) Los VARRAYs pueden verse como tablas anidadas limitadas (soportan un nmero lmite de elementos) El total de elementos del VARRAY est determinado por el nmero de elementos activos (existentes) en el VARRAY (no puede sobrepasar el mximo que se defina)
*Aunque se puede aplicar el principio de sustitucin.
Bases de Datos Avanzado

Consultando un VARRAY de nmeros 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)); INSERT INTO varray_table VALUES(200, num_varray(2,5,3));
import import import import java.sql.*; java.math.*; oracle.sql.*; oracle.jdbc.driver.*;

//Requiere el driver de Oracle // Requiere el driver de Oracle

class consulta_varray { static public void main(String[] args) { Connection conn; Statement stmt; ResultSet resultado; System.out.println( "Intentando conexin a la bd..." );

Bases de Datos Avanzado

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:@apaza:5500:ocrl", "user", "password"); stmt = conn.createStatement(); } 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 dni; //Alternativa a String, pero exclusivo para Oracle ARRAY mi_array; BigDecimal out_value; BigDecimal[] values; Contina
Bases de Datos Avanzado

while (resultado.next()) { dni= (CHAR)((OracleResultSet)resultado).getOracleObject(1); System.out.println("Notas del estudiante con cdigo " + dni); 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()); } } conn.close(); }catch( SQLException e ) { System.out.println("Se produjo el error " + e.getMessage()); return; } System.out.println("Consulta finalizada." ); } }
Bases de Datos Avanzado

Contina

Bases de Datos Avanzado

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


Clave Primaria

Tabla estudiante con columnas


contacto_list Y se insertarn algunas filas

dni VARCHAR2(8) contactos

Bases de Datos Avanzado

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
import import import import java.sql.*; java.math.*; oracle.sql.*; oracle.jdbc.driver.*;

dni

contactos 101 Cl 4 Av 8 Cl 9

10

12 201

class tab_anidada { static public void main( String[] args ) { Connection conn; Statement sentencia; ResultSet resultado; System.out.println("Intentando conexin a la bd..." );
Bases de Datos Avanzado

20 42 Av 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 conexion con la base de datos conn = DriverManager.getConnection ("jdbc:oracle:thin:@apaza:5500:ocrl", "user", "password"); sentencia = conn.createStatement(); } catch( SQLException e ) { System.out.println( "No hay conexion con la base de datos." ); return; }

Bases de Datos Avanzado

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"); } catch( SQLException e ){ System.out.println("Tipo contacto ya creado" );} try{ sentencia.execute("CREATE TABLE estudiante (dni VARCHAR2(8) PRIMARY KEY, contactos contacto_list) NESTED TABLE contactos STORE AS nestels"); } catch( SQLException e ){ Bases de Datos Avanzado System.out.println("Tabla estudiante ya

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" );} try{ System.out.println("Consultando...DNIs y telefonos de cada estudiante" ); resultado = sentencia.executeQuery("SELECT * FROM estudiante"); ARRAY mi_array; Bases de Datos Avanzado String DNI;

while (resultado.next()) { DNI = resultado.getString(1); mi_array = ((OracleResultSet)resultado).getARRAY(2); System.out.println("Los telfonos del estudiante con DNI "+ DNI + " 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]); } }
Bases de Datos Avanzado

} catch( SQLException e ) { System.out.println("se produjo elerror " + e.getMessage()); return; } System.out.println("Consulta finalizada."); }
}

Bases de Datos Avanzado

Bases de Datos Avanzado

Ejecutando una funcin PL/SQL desde Java


Cmo enviar parmetros y cmo recibir el resultado? (tanto de la funcin como de parmetros de retorno: OUT) Se definir una funcin escrita en PL/SQL la cual devuelve una cadena de caracteres y tiene 2 parmetros:
-Uno de entrada, de tipo VARCHAR -Uno de salida, de tipo DATE

Se invocar desde Java mediante un bloque annimo Begin llamado_funcin End; Para ello se usar el objeto: OracleCallableStatement Luego se recibir el resultado y se imprimir desde Java por pantalla Inicialmente se crea la funcin directamente en SQL*Plus, luego se ver cmo incluso puede ser creada dinmicamente desde Java
Bases de Datos Avanzado

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

Bases de Datos Avanzado

import import import import

java.sql.*; java.math.*; oracle.sql.*; oracle.jdbc.driver.*;

class llamafunc { static public void main( String[] args ) { Connection conn; Statement stmt; ResultSet resultado; System.out.println("Intentando conexin a la bd..." );
Bases de Datos Avanzado

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:@apaza:5500:ocrl","user", "password"); stmt = conn.createStatement(); } catch( SQLException e ) { System.out.println( "No hay conexin con la base de datos." ); return; }

Bases de Datos Avanzado

try { //Se prepara el llamado y los parmetros System.out.println( "Invocando una funcin con parmetros 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);


Bases de Datos Avanzado

// Se ejecuta el llamado a la funcin 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" ); } }
Bases de Datos Avanzado

Bases de Datos Avanzado

Ahora se crear la funcin dinmicamente : Agregar el siguiente cdigo al programa anterior inmediatamente antes de:
//Se prepara el llamado y los parmetros

System.out.println("Se crear la funcin dinmicamente"); 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;"; Ojo: Son 2 comillas simples seguidas f = f + " RETURN cadena;"; f = f + "END;'; END;"; //System.out.println( f); OracleCallableStatement cstmt2 = (OracleCallableStatement)conn.prepareCall(f); cstmt2.execute();

Bases de Datos Avanzado

Bases de Datos Avanzado

Tambin se puede llamar una funcin de envolturapor 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 funcin de envoltura debe especificarse la jerarqua completa del tipo Bases de Datos Avanzado (BigDecimal)

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:@apaza:5500:ocrl","user", "pass"); s = c.createStatement(); }catch(SQLException e){ System.out.println("Sin conexin");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());} Bases de Datos Avanzado

Bases de Datos en Internet y JSP


Significa que al invocar desde Java a esta funcin se est llamando a un mtodo de una clase Java construida dentro de Oracle, la cual igualmente podra ser construida dinmicamente 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 etcy el mecanismo de conectividad y manipulacin es similar El prximo paso es llevar los resultados a la web los cuales sern visualizados en un navegador (Internet Explorer, Netscape etc.)

JSP: Java Server Pages es un lenguaje que permite mezclar cdigo Java dentro de lenguaje HTML
Nos centraremos en el uso de JSP orientado a la interaccin con Bases de Datos, como caso particular con Oracle, pero el mtodo de trabajo con otros SGBDs es similar

Permite la generacin de pginas HTML dinmicas (se construyen en tiempo de ejecucin)


Bases de Datos Avanzado

Otras alternativas a JSP


Existen otras alternativas a JSP:
PHP Hypertext Preprocessor (Personal Home Page)Independiente ASP (Active Server Pages) Microsoft

PSP (PL/SQL Server Pages) Oracle

Para interactuar con el navegador se requiere un software especial (Servidor Web) el cual puede ser el Tomcat, Wos, xampp, etc.

Un archivo JSP puede ser creado con cualquier editor de texto


La extensin es JSP Se comenzar con un ejemplo que muestra la sintaxis bsica: consiste fundamentalmente en como incorporar cdigo Java stand alone en una pgina JSP (luego se pasar a interactuar con la BD)
Bases de Datos Avanzado

<html> <head> <title>Pgina Ensayo JSP</title> </head> <body> <!-- Comentario HTML normal --> <%-- Esto es un comentario en JSP--%> <%@ page import="java.math.*" %> Forma de importar <%-- Declaracion de variables en JSP: --%> libreras en JSP <%! int i = 0, j = 10; double k = 3.14; %> <%! java.util.Date fecha = new java.util.Date(); %> <%-- Impresin de los valores de las variables --%> <br>

Bases de Datos Avanzado

Valor de la variable i, i = <%= i %><p> Impresin de una vble en JSP Valor de la variable j, j = <%= j %><p> Valor de la variable k, k = <%= k %><p> Hola, la fecha de hoy es <%= fecha %><p> Ahora veamos un ciclo <p> <% for(int z=1; z<=7; z++) { %> Cdigo Java incrustado en JSP <br> <% if (z%2 == 0){ %>
<font color="blue" size=" <%=z %> "> Voy creciendo en azul! z=<%= z %> </font> <font color="green" size="<%=z %> "> Voy creciendo en verde! z=<%= z %> </font>

<% } else { %>

<% } %> <% } %> </body> </html>

Bases de Datos Avanzado

Procedimiento: Nombrar el archivo as: hola.jsp Copiar el archivo en la siguiente ruta: carpeta_tomcat/webapps/ROOT/nombre_carpeta/ Iniciar el Servidor. Invocar en el navegador : http://servidor:puerto/nombre_carpeta/hola.jsp

Bases de Datos Avanzado

Bases de Datos Avanzado

Cdigo HTML generado:


<html> <head> <title>Pagina Ensayo JSP</title> </head> <body> <!-- Comentario HTML normal --> <br> Valor de la variable i, i = 0<p> Valor de la variable j, j = 10<p> Valor de la variable k, k = 3.14<p> Hola, la fecha de hoy es Tue Apr 18 18:02:52 COT 2006<p> Ahora veamos un ciclo <p> <br><font color="green" size="1 "> Voy creciendo en verde! z=1 </font> <br><font color="blue" size="2 "> Voy creciendo en azul! z=2 </font> <br><font color="green" size="3 "> Voy creciendo en verde! z=3 </font> <br><font color="blue" size="4 "> Voy creciendo en azul! z=4 </font> <br><font color="green" size="5 "> Voy creciendo en verde! z=5 </font> <br><font color="blue" size="6 "> Voy creciendo en azul! z=6 </font> <br><font color="green" size="7 "> Voy creciendo en verde! z=7 </font> </body> Bases de Datos Avanzado </html>

Manejo de Errores
Archivo PaginaError.jsp: <%@ page errorPage="errorPage.jsp" %> <HTML> <BODY> Hola <%= 3/0 %> </BODY> </HTML> Archivo errorPage.jsp: <%@ page isErrorPage="true" import="java.util.*" %> <HTML> <BODY> Ocurri&oacute; un error: <%= exception.toString() %> </BODY> </HTML>
Bases de Datos Avanzado

Ahora se realizar una pgina JSP que accesar a la BD. Crear la siguiente tabla:
DROP TABLE emp; CREATE TABLE emp( empno NUMBER(3) PRIMARY KEY, empname VARCHAR2(10) NOT NULL ); INSERT INTO emp VALUES(100, 'Luis'); INSERT INTO emp VALUES(200, 'Juan'); INSERT INTO emp VALUES(300, 'Lucas'); COMMIT; Ahora bajar el archivo Conexion.zip y extraer el archivo conexion.jsp Colocarlo en la ruta: carpeta_tomcat/webapps/ROOT/nombre_carpeta/ Para cambiarle el usuario y el password Ejecutar lo siguiente (habiendo iniciado el Tomcat): http://servidor:puerto/nombre_carpeta/conexion.jsp Pero antes ser analizadoEl resultado en pantalla debe ser el siguiente:
Bases de Datos Avanzado

Bases de Datos Avanzado

Ahora se realizar una pgina JSP mediante la cual se pueden ejecutar diferentes consultas y cuyo resultado se construye dinmicamente. Bajar el archivo Consulta.zip, el cual contiene los siguientes archivos: consulta.html No olvidar cambiar consulta.jsp usuario y password errorPage.jsp Se colocan en la misma ruta que los anteriores Para ejecutar:
http://servidor:puerto/nombre_carpeta/consulta.html

Bases de Datos Avanzado

Ahora construiremos un formulario HTML con validaciones en JavaScript que permitir insertar un nuevo cliente de una compaa en su tabla respectiva. Bajar el archivo: Celulares.zip, el cual contiene los archivos:
celularesinserta.jsp, celularesinserta.htm, celularesinsertafotos.zip
Cambiar usuario y password

Colocarlos en la misma ruta de los anteriores Descomprimir tambin el archivo celularesinsertafotos.zip y antes de ejecutar, crear la siguiente tabla y la siguiente secuencia:

Bases de Datos Avanzado

CREATE TABLE clientecelular( carnet NUMBER(10) PRIMARY KEY, nombre VARCHAR(20) NOT NULL, apellidos VARCHAR(20) NOT NULL, email VARCHAR(30) NOT NULL UNIQUE, sexo CHAR(1) NOT NULL CHECK(sexo IN('m','f')), tel NUMBER(10), tipoingresos NUMBER(1) CHECK(tipoingresos IN(1,2,3)), password VARCHAR(20) NOT NULL, estado_civil CHAR(1) CHECK(estado_civil IN('s','c')) );
CREATE SEQUENCE carnet;

Ahora invocar:http://servidor:puerto/nombre_carpeta/celularesinserta.htm

Bases de Datos Avanzado

Ahora se ver una aplicacin que consulta una tabla de empleados y permite recuperar su foto (formato jpg) y su hoja de vida (formato .doc ) Bajar el archivo Traer_empleados.zip el cual contiene: traer_empleado.html Cambiar usuario y traer_empleado.jsp password traer_todos.jsp traer_FotosyHojas.zip Colocarlos en la misma ruta que los anteriores Descomprimir tambin el archivo traer_FotosyHojas.zip Antes de ejecutar se crear la siguiente tabla:

Bases de Datos Avanzado

DROP TABLE artista; CREATE TABLE artista( codigo NUMBER(3) PRIMARY KEY, nombrereal VARCHAR2(20), nombreartistico VARCHAR2(20), foto VARCHAR2(30), hojadevida VARCHAR2(30) );
INSERT INTO artista VALUES(10,'Carlow Wright','Gigante','giant.jpg','giant.doc'); INSERT INTO artista VALUES(20,'Sharon Gmez','Gorilona','apegirlie.jpg','apegirlie.doc'); INSERT INTO artista VALUES(30,'Pedro Hawkshaw','Barbudo','beard.jpg','beard.doc'); INSERT INTO artista VALUES(40,'N.N','Hombre Invisible','invisible.jpg','invisible.doc'); INSERT INTO artista VALUES(50,'Don Gato','Felpa', 'gato.jpg','gato.doc'); COMMIT;
Bases de Datos Avanzado

Y ahora invocar:
http://servidor:puerto/nombre_carpeta/traer_empleado.html

Al presionar el botn Mostrarlos Todos se genera una pgina HTML dinmica que provee acceso a la foto y a la hoja de vida del artista Por medio del botn Enviar Consulta se puede consultar los datos de un empleado particular por medio de su cdigo Ntese que en la base de datos NO se guardan ni las fotos ni los documentos, estos residen en un directorio y pueden ubicarse en un servidor esto minimiza el tamao de la BD, aunque es menos seguro

Bases de Datos Avanzado

El siguiente ejemplo muestra una interfaz que permite al usuario final crear una tabla desde el navegador
Bajar el archivo Creatabla.zip, al descomprimir se generan los archivos: generatabla.jsp Cambiar usuario generatabla.html y password creatabla.jsp Invocar: http://servidor:puerto/nombre_carpeta/generatabla.html La interfaz es incipiente, sin embargo podra llegar a extenderse hasta ser convertida en un pequeo wizard (asistente) de creacin de tablas

Bases de Datos Avanzado

Ahora se ver cmo generar de manera dinmica los elementos de una lista de seleccin que extrae sus valores de una tabla de la BD
Sea la tabla: CREATE TABLE genero( codigo NUMBER(3) PRIMARY KEY, nombre VARCHAR2(15) NOT NULL UNIQUE, descripcion VARCHAR2(30) );

INSERT INTO INSERT INTO INSERT INTO INSERT INTO COMMIT;

genero genero genero genero

VALUES(1,'Soul','Indescriptible!'); VALUES(2,'Pop','Msica para Hello Kitty!'); VALUES(3,'Jazz','Se origin en China'); VALUES(4,'House','Tiene muchos subgneros!');

Bases de Datos Avanzado

Tambin se ver el proceso para un radio button, sea la tabla:


CREATE TABLE tipo_miembro( codtipo NUMBER(3) PRIMARY KEY, nombre VARCHAR2(20) NOT NULL UNIQUE, valor NUMBER(3) NOT NULL, privilegios VARCHAR (40) ); INSERT INTO tipo_miembro VALUES(10,'Oro', 900, 'Cenar con los artistas'); INSERT INTO tipo_miembro VALUES(20,'Plata', 500, 'Bajar la msica' ); INSERT INTO tipo_miembro VALUES(30,'Madera', 100, 'Mirar pero no tocar!'); COMMIT; Ahora bajar el archivo ListayRadio.zip, descomprimir y ubicar en la misma ruta que los anteriores cambiar usuario y password. Invocar http://servidor:puerto/nombre_carpeta/listayradio.jsp
Bases de Datos Avanzado

Ahora se ver un mtodo rudimentario de cmo generar dinmicamente los elementos de un formulario, es decir, un formulario que genera formularios El formulario es dinmico desde el punto de vista de la cantidad de elementos que puede poseer:
Cajas de dilogo (text) Passwords Radio Buttons Mens (select).

Si se analizan las caractersticas bsicas de un elemento en un formulario son: nombre del elemento label (mensaje que aparece en pantalla). tipo de elemento: si es de entrada (dilogo), password, radio, etc. valor y label (correspondiente al valor) (puede ser una lista de valores en el caso de un radio o de una lista de seleccin) size (para algunos elementos aplica) Otras caractersticas que no sern analizadas en este momento
Bases de Datos Avanzado

Ejemplo 1:
Entre su email<input type="text" name="email" size="20"></p> nombre: email label: Entre su email tipo de elemento: text valor: no tiene (ingresado por el usuario en este caso) size: 20

Bases de Datos Avanzado

Ejemplo 2:
Gnero Favorito: <select size="1" name="tipogenero"> <option value="1">Soul</option> <option value="2">Pop</option> <option value="3">Jazz</option> <option value="4">House</option> </select> nombre: tipogenero label: Genero Favorito tipo de elemento: select valor: 1,2,3,4 label (correspondiente a los valores): Soul, Pop, Jazz, House size: 1

Bases de Datos Avanzado

Bajar el archivo FormaForma.zip, extraer y ejecutar en SQL*Plus las instrucciones del archivo crear.sql, extraer el archivo formaforma.jsp, cambiar el usuario y password y colocarlo en la misma ruta que los anteriores
Finalmente desactivar el Tomcat : Ejecutar el archivo shutdown ubicado en la carpeta bin del tomcat. Caractersticas de las pginas JSP vistas hasta ahora: -La mezcla de cdigo HTML y Java puede volverse compleja e ilegible Difcil de mantener -Se mezclan aspectos de presentacin con la lgica del negocio -Un cambio en la presentacin de la pgina o en la lgica del negocio implica cambiar la pgina JSP
Bases de Datos Avanzado

Por qu los Java Beans?


El uso de Java Beans permite - Eliminar gran parte del cdigo Java de la pgina JSP - Separar la presentacin de la lgica del negocio Beneficio: Se puede cambiar la presentacin independientemente de la lgica del negocio y viceversa - Enfocar los diferentes tipos de usuarios en sus labores correspondiente (diseador de pginas vs. programador) - Reutilizar cdigo Java en diferentes pginas JSP - Un Java Bean, desde el punto de vista del diseador de pginas, no es ms que una clase Java de la cual se pueden usar sus mtodos bajo ciertas reglas y convenciones - Para el programador no es ms que una clase Java que ser usada como un componente reutilizable
Bases de Datos Avanzado

Bases de Datos Avanzado

Reglas y convenciones de un Java Bean:


- Debe poseer un constructor sin parmetros (o el constructor por defecto) - Debe incorporar mtodos pblicos cuyos nombres comienzan por get y set, los cuales permiten normalmente acceder a las propiedades de la clase que se desean hacer visibles A travs de los mtodos getXxx se puede recuperar el valor de la propiedad cuyo nombre es Xxx. - A travs de los mtodos setXxx se puede asignar un valor a la propiedad cuyo nombre es Xxx. - Es posible disear un mtodo setXxx que asigne valores a varias propiedades, en tal caso Xxx no se corresponde necesariamente con una propiedad especfica
Bases de Datos Avanzado

Generalmente:
- Un mtodo get no recibe parmetros y retorna el mismo tipo de datos de la propiedad Xxx - Un mtodo set no devuelve ningn valor y recibe como parmetro un valor del mismo tipo de datos de la propiedad Xxx Ejemplo: Sea una propiedad apellido de tipo String, entonces posiblemente existen 2 mtodos:

setApellido(p String) return void getApellido() return String


- Normalmente a una clase Java que va a ser utilizada como Java Bean, se le adiciona al final de su nombre la palabra Bean

Bases de Datos Avanzado

Invocacin de un Java Bean


Para instanciar (invocar) un Java Bean en una pgina JSP se usa la etiqueta: <jsp:usebean id=nombre_bean_en_la_JSP class=nombre_clase_bean /> Donde: Id: Es el nombre por medio del cual se va a hacer referencia al bean dentro de la pgina JSP Class: Es el nombre de la clase Java que se va a instanciar (bean)
Esta instruccin instancia el bean e invoca su constructor (sin parmetros).
Ojo: O lo localiza si ya existe, ver luego

Bases de Datos Avanzado

Ejemplo 1
Sea la clase java: (Copyright Agustn Froufe 2002)
package bases2; public class jsp0201{ private String saludo = "Hola"; // Constructor por defecto public jsp0201() {} // Mtodos set y get para asignar y recuperar el valor de la propiedad // saludo, que se utilizar en la pgina JSP public void setSaludo( String _saludo ) { saludo = _saludo; } public String getSaludo() { return( saludo ); } public String saludoActual() { return("El saludo vigente es: "+ saludo); Bases de Datos Avanzado }

La clase java anterior puede ser invocada as:


<%-- archivo: jsp0209.jsp --%> <html> <head> <title>Tutorial JSP, Accin jsp:useBean</title> </head> Se instancia <body> el bean <%@ page import = "bases2.jsp0201"%> <jsp:useBean id="miBean" class= "bases2.jsp0201" /> <p>Saludo inicial:<br> <%-- se obtiene a partir del valor actual de la propiedad del bean, invocando al mtodo get() de la propiedad saludo--%> <b><%= miBean.getSaludo() %></b> <p><b><%= miBean.saludoActual() %></b> <%-- se fija el nuevo valor de la propiedad y se presenta de nuevo usando el mtodo get() de la propiedad saludo--%> <% miBean.setSaludo( "Adios" ); %> <p>Saludo final:<br> <b><%= miBean.getSaludo() %></b> </body> </html>
Bases de Datos Avanzado

Para hacer uso de los mtodos que expone (ofrece) un bean se puede hacer uso de las etiquetas:
<jsp:getProperty name =nombre_bean_en_la_JSP property =nombre_propiedad /> Aqu se est recuperando el valor de la propiedad nombre_propiedad a travs de la invocacin del mtodo getNombre_propiedad que debe existir en el bean cuyo id es nombre_bean_en_la_JSP La otra etiqueta es: <jsp:setProperty name =nombre_bean_en_la_JSP property =nombre_propiedad value =nuevo_valor /> Aqu se est asignando a la propiedad nombre_propiedad el valor nuevo_valor a travs de la invocacin del mtodo SetNombre_propiedad que debe existir en el bean cuyo id es nombre_bean_en_la_JSP
Bases de Datos Avanzado

Minscula

Mayscula

Ejemplo 2
Invocando al bean anterior y usando setProperty y getProperty: <%-- archivo: jsp0210.jsp --%> <html> <head><title>Tutorial JSP, Accin jsp:useBean</title></head> <body> <%@ page import = "bases2.jsp0201"%> <jsp:useBean id="miBean" class= "bases2.jsp0201" /> <p>Saludo inicial:<br> <%-- se obtiene a partir del valor actual de la propiedad del bean, utilizando la accin jsp:getProperty --%> <b><jsp:getProperty name="miBean" property="saludo" /></b> <p>Saludo final:<br> <%-- se fija el nuevo valor de la propiedad, para asignarle el valor de la despedida a travs de la accin jsp:setProperty, y se presenta de nuevo usando la accin jsp:getProperty --%> <jsp:setProperty name="miBean" property="saludo" value="Adios Mundo Cruel!" /> <b><jsp:getProperty name="miBean" property="saludo" /> </b> </body> </html>
Bases de Datos Avanzado

Ejemplo 3
- Se ver ahora un ejemplo con un Java Bean que ofrece los mtodos necesarios para realizar un juego sencillo que consiste en que el usuario adivine un nmero entre el 1 y el 100 - Luego se ver un ejemplo de un Java Bean que interacta con una BD - Sea el Java Bean: NumberGuessBean

NumberGuessBean
setGuess()

answer success hint numGuesses

getSuccess() getHint() getNumGuesses()

NumberGuessBean()
Bases de Datos Avanzado

reset()

La implementacin de la clase Java correspondiente paso a paso es (archivo NumberGuessBean.java):


package num; import java.util.*; public class NumberGuessBean { int answer; boolean success; Propiedades del Bean String hint; int numGuesses; public NumberGuessBean(){ reset(); }
Constructor sin parmetros

Bases de Datos Avanzado

public void setGuess(String guess) { numGuesses++; int g; try{ g = Integer.parseInt(guess); }catch (NumberFormatException e) { g = -1; } if (g == answer) success = true; else if (g == -1) Mtodo setGuess hint = "a number next time"; else if (g < answer) hint = "higher"; else hint = "lower"; }
Bases de Datos Avanzado

public boolean getSuccess(){ return success; }


public String getHint(){ return " " + hint; } public int getNumGuesses(){ return numGuesses; }

Mtodo getSuccess

Mtodo getHint

Mtodo getNumGuesses

public void reset(){ answer = Math.abs(new Random().nextInt()%100)+1; success = false; numGuesses = 0; } }


Bases de Datos Avanzado

Mtodo reset

- Ahora se presentar la pgina JSP que instancia el bean anterior y hace uso de los mtodos existentes en l. Archivo: numguess.jsp - El bean se instancia desde el directorio num (lugar donde queda luego de la compilacin debido a la instruccin package)
<%@ page import = "num.NumberGuessBean"%> <jsp:useBean id="numguess" class="num.NumberGuessBean"/> <jsp:setProperty name="numguess" property="*"/> <html> <head><title>Number Guess</title></head> <body bgcolor="white"> <font size=4>
Bases de Datos Avanzado

Qu significa? Ntese que falta adems value

<% if (numguess.getSuccess()){ %> Congratulations! You got it. And after just <%= numguess.getNumGuesses() %> tries.<p> <% numguess.reset(); %> Care to <a href="numguess.jsp">try again</a>? <% }else if (numguess.getNumGuesses() == 0) { %> Welcome to the Number Guess game.<p> I'm thinking of a number between 1 and 100.<p> <form method=get> What's your guess? <input type=text name=guess> <input type=submit value="Submit"> </form> <%}else { %> Good guess, but nope. Try <b> <%= numguess.getHint() %> </b>. You have made <%= numguess.getNumGuesses() %> guesses.<p> I'm thinking of a number between 1 and 100.<p> <form method=get> What's your guess? <input type=text name=guess> <input type=submit value="Submit"></form> <% } %></font></body></html>
Bases de Datos Avanzado

Ejemplo 1: Insercin de datos en una tabla


Se realizar un formulario muy simple que mediante un Java Bean permitir ingresar informacin a una tabla de la BD. Sea la tabla: DROP TABLE empleado; CREATE TABLE empleado( DNI VARCHAR2(10) PRIMARY KEY, nombre VARCHAR2(20) NOT NULL, salario NUMBER(6) ); Archivo: insertaemp.html, ubicarlo en la ruta del Tomcat correspondiente <html> <head> <title>Forma de Insercin de Empleados</title> </head> <body> <p align="center"><b>Forma de Insercin de Empleados</b></p> <form method="post" action="insertaemp.jsp"><p><p><b> <font color="#003399">Cdula:&nbsp;&nbsp; </font><font color="#0000FF">&nbsp;</font></b> <input type="text" name="DNI" size="20"> <p><font color="#003399"><b>Nombre: </b>&nbsp;</font> Bases de Datos Avanzado

<input type="text" name="nombre" size="42"></p><p><b> <font color="#003399">Sueldo:&nbsp;&nbsp;&nbsp;&nbsp; </font></b> <input type="text" name="sueldo" size="18"></p> <p>&nbsp;</p> <p align="center"> <font color="#003399"> <span style="background-color: #FFFF00"> <input type="Submit" value="Insertar" name="Insertar"></span> </font></p> <p align="center">&nbsp;</p> </form> </body> </html>

Bases de Datos Avanzado

Bases de Datos Avanzado

Archivo insertaemp.jsp <html> <head> <title>Pgina que realiza la insercion</title> Se instancia el bean que </head><body> la <%@ page import="java.util.*,java.io.*" %><br> realizar insercin <%@ page import = "bases2.insertaemp" %> <jsp:useBean id="ins" class= "bases2.insertaemp"/> <jsp:setProperty name="ins" property="DNI" value= "<%=request.getParameter("DNI") %>" /> <jsp:setProperty name="ins" property="nombre" value= "<%=request.getParameter("nombre") %>" /> <jsp:setProperty name="ins" property="sueldo" value= "<%=request.getParameter("sueldo") %>" /> <% ins.inserta(); %> <h2>La insercin ha sido realizada</h2></body> </html>
Bases de Datos Avanzado

Archivo insertaemp.java el cual genera el bean insertaemp.class package bases2; import java.sql.*; import java.io.*; import java.text.*; public class insertaemp { Connection conn=null; Statement sentencia=null; ResultSet resultado=null; String DNI; String nombre; String sueldo; String instruccion; //Constructor: realiza la funcin de conectarse... //Como es un bean el constructor va sin parmetros public insertaemp() { Conectarse();}
Bases de Datos Avanzado

public void Conectarse() { try{ Class.forName ("oracle.jdbc.driver.OracleDriver"); }catch( Exception e ){ System.out.println( "No se pudo cargar el driver JDBC" );} try{ // Se establece la conexion con la base de datos conn = DriverManager.getConnection( "jdbc:oracle:thin:@apaza:5500:ocrl","user","password"); sentencia = conn.createStatement(); }catch( SQLException e ){ System.out.println("No se pudo conectar con la bd" );} } public void inserta() { instruccion = "Insert into empleado values(' " + DNI + "', '" + nombre + "'," + sueldo + ")"; try{ sentencia.execute(instruccion);} catch(SQLException e ) { System.out.println("Error: " + e.getMessage()); } }
Bases de Datos Avanzado

public void setDNI(String dato){ DNI = dato; } public void setNombre(String dato){ nombre = dato; } public void setSueldo(String dato){ sueldo = dato; } } El uso de request.getParameter puede evitarse en este caso as: Crear el archivo insertaemp2.html igual al archivo insertaemp.html pero en el action invocar a insertaemp2.jsp que es el siguiente: <html><head> <title>Pagina que realiza la insercion</title> </head><body> <%@ page import="java.util.*,java.io.*" %><br> <%@ page import = "bases2.insertaemp" %> <jsp:useBean id="ins" class="bases2.insertaemp"/> <jsp:setProperty name="ins" property="DNI" param="DNI" /> <jsp:setProperty name="ins" property="nombre" param="nombre" /> <jsp:setProperty name="ins" property="sueldo" param="sueldo" /> <% ins.inserta(); %> <h2>La insercin ha sido realizada</h2></body></html> Bases de Datos Avanzado

Ejemplo 2: Manejo de Msica


Ahora se ver una aplicacin que permite ingresar, listar y observar canciones (aunque tambin soporta imgenes y videos por ejemplo)
Crear la siguiente tabla y secuencia: CREATE SEQUENCE codigocancion; CREATE TABLE cancion( codigo NUMBER(6) PRIMARY KEY, nombre VARCHAR2(50) NOT NULL, tipo VARCHAR(10) NOT NULL, rutacancion VARCHAR2(150) NOT NULL, rutatexto VARCHAR2(150) ); La secuencia se crea para generar automticamente el cdigo de las canciones. La aplicacin se compone de los siguientes archivos:

cancionmenu.html:
Formulario principal a travs del cual se pueden observar, ingresar o listar las canciones.
Bases de Datos Avanzado

cancionlista.jsp: Pgina JSP que recupera todos las canciones existentes en la base de datos. No usa Java Beans. Es invocada por cancionmenu.html. cancionconsulta.jsp: Pgina JSP que muestra la cancin correspondiente a un cdigo de cancin dado. No usa Java Beans. Es invocada por cancionmenu.html. cancioninserta.jsp: Pgina JSP que ingresa una cancin a la base de datos, para ello utiliza un Bean llamado insertacancionBean. Es invocada por cancionmenu.html. cancioninsertaBean.java Archivo fuente Java que genera el Java Bean correspondiente (cancioninsertaBean.class). Consta de los siguientes mtodos: - cancioninsertaBean(): Constructor que invoca al mtodo conectarse()

Bases de Datos Avanzado

- conectarse(): Mtodo que establece la conexin con la BD - inserta(): Mtodo que realiza la insercin de la cancin en la BD - getSecuencia(): Devuelve el cdigo de la ltima cancin - setTitulo(String): Asigna el nombre del ttulo de la cancin - setTipo(String): Asigna el tipo de la cancin - setRutacancion(String): Asigna la ruta donde est ubicada la cancin - setRutatexto(String): Asigna la ruta del archivo de notas complementarias de la cancin Fondo.jpg: Archivo utilizado en varios de los formularios como fondo. esqueletos.gif: Grfico utilizado por cancionconsulta.jsp Las canciones se guardan por fuera de la base de datos Grficamente esta es la estructura de la aplicacin:
Bases de Datos Avanzado

cancionlista.jsp

cancionmenu.html

cancionconsulta.jsp

cancioninserta.jsp

Canciones

B.D.

cancioninsertaBean
Bases de Datos Avanzado

Bean utilizado:
inserta() cancioninsertaBean
setTipo(String) setTitulo(String) setRutacancion(String) setRutatexto(String)
tipo titulo rutacancion rutatexto secuencia conn sentencia resultado instruccion

getSecuencia()

cancioninsertaBean()

conectarse()
Bases de Datos Avanzado

Ahora se examinarn uno a uno los archivos utilizados, descargar el archivo cancion.zip de la pgina principal del curso. Cambiar password y username en: - cancionconsulta.jsp - cancioninsertaBean.java ubicarlo en la ruta de los beans - cancionlista.jsp Ubicar todos los archivos, excepto el bean, en el directorio de trabajo del TomCat normalmente Se muestra a continuacin la forma de entrada a la aplicacin: cancionmenu.html

Bases de Datos Avanzado

Bases de Datos Avanzado

JSP vs. ASP (Active Server Pages)


Ambas soportan inclusin de cdigo directamente en la pgina as como componentes (Java Beans en JSP y COM en ASP) JSP - Para diversos sistemas operativos y diversos servidores Web - Ms lento la primera vez (que es llamado) que ASP, luego su rendimiento se acerca al de ASP ASP - Para Windows y trabaja con IIS (Internet Information Server) como servidor Web - En general ms rpido que JSP, debido a que la interpretacin de cdigo nativo es ms rpido que la mquina virtual de Java

Bases de Datos Avanzado

Ejemplo Cesta de Compra con Java Beans


Archivo: carts.html <html> <head> <title>carts</title> </head> <body bgcolor="white"> <font size = 5 color="#CC0000"> <form type=POST action=carts.jsp> <BR> Please enter item to add or remove: <br> Add Item: <SELECT NAME="item"> <OPTION>Twin peaks tapes <OPTION>JSP Book <OPTION>Concert tickets <OPTION>Rex, Rugs & Rock n' Roll </SELECT> <br> <br> <INPUT TYPE=submit name="submit" value="add"> <INPUT TYPE=submit name="submit" value="remove"> </form> carts.html contina en </font></body></html>
Bases de Datos Avanzado

la prxima diapositiva

Archivo: carts.jsp
<html> <jsp:useBean id="cart" scope="session" class="sessions.DummyCart" /> <jsp:setProperty name="cart" property="*" /> <% cart.processRequest(request);%> <FONT size = 5 COLOR="#CC0000"> <br> You have the following items in your cart: <ol><% String[] items = cart.getItems(); for (int i=0; i<items.length; i++) {%> <li> <%= items[i] %> <%}%> </ol> </FONT> <hr> <%@ include file ="carts.html" %> </html>
Bases de Datos Avanzado

Fin de carts.jsp

El Java Bean, archivo: DummyCart.java


package sessions; import javax.servlet.http.*; import java.util.Vector; import java.util.Enumeration; public class DummyCart { Vector v = new Vector(); String submit = null; String item = null; private void addItem(String name) { v.addElement(name); } private void removeItem(String name) { v.removeElement(name); }
Bases de Datos Avanzado

El Java bean contina en la prxima diapositiva

public void setItem(String name) { item = name; }


public void setSubmit(String s) { submit = s; } public String[] getItems() { String[] s = new String[v.size()]; v.copyInto(s); return s; }
El Java bean contina en la prxima diapositiva
Bases de Datos Avanzado

public void processRequest(HttpServletRequest request) { // null value for submit - user hit enter instead of clicking on // "add" or "remove" if (submit == null) addItem(item); if (submit.equals("add")) addItem(item); else if (submit.equals("remove")) removeItem(item);
// reset at the end of the request reset(); } // reset private void reset() { submit = null; item = null; }
Bases de Datos Avanzado

Fin del Java bean

Qu es XML?
Extensible Markup Language del W3C Sintaxis para normalizar el Intercambio de Datos en la WEB Orientado al contenido NO a la presentacin

Doc
XML
Contenido

XSL

Pgina

HTML
Presentacin
Bases de Datos Avanzado

Caractersticas de XML1
Se pueden definir nuevas etiquetas La estructura puede ser anidada arbitrariamente Se puede tener una descripcin opcional de su estructura vlida (gramtica) mediante DTD (Document Type Definition) o XML Schema Para presentacin se puede usar: XSL (XML Stylesheet Language) Existen lenguajes de consulta para XML (XQuery, XPath, XML-QL etc.) Documento con estructura de rbol (grafo si se usa idref) Permite manipular fragmentos de documentos La unidad bsica de un documento XML es una pieza de texto limitada por etiquetas de apertura y cierre Con XML se pueden representar los datos de una BD: - Autodescriptivo: etiquetas (dan el significado de los datos)+ contenido - til para intercambiar datos entre aplicaciones - Desventaja: Repeticin de etiquetas

Bases de Datos Avanzado

Elemento XML
Etiqueta de apertura del elemento

1
Etiqueta de cierre del elemento

<persona> ... </persona>


Contiene texto u otros elementos (nivel de anidamiento ilimitado)

Las etiquetas deben estar balanceadas y son


definidas por el usuario Para una coleccin se puede usar varias veces el mismo elemento (por ejemplo para representar el conjunto de emails de una persona)
Bases de Datos Avanzado

Elemento XML

<persona> <nombre>Pedro</nombre> <edad>25</edad> <email>peter@123.com</email> <email>peter@abc.com</email> </persona>

El nombre del elemento diferencia maysculas y minsculas, permite caracteres: alfanumricos, _ , ,.

En algunas herramientas que leen XML, tanto el nombre del elemento como su contenido no pueden contener caracteres con

tilde, la etc.

Bases de Datos Avanzado

Elemento XML
En el ejemplo anterior:

<nombre> es sub-elemento (hijo) de <persona> rbol Datos de tipo PCDATA (Parsed Character Data), todo dato es tratado como texto Caracteres en Unicode: Proporciona un nmero nico para cada carcter, sin importar la plataforma, el programa etc. www.unicode.org Un elemento vaco se puede representar as: <persona/> o as: <persona> </persona>
Bases de Datos Avanzado

Atributos en XML
<producto id = "101" > <nombre lengua = "Espanol" > Internet Magazine </nombre> <precio moneda = "dolar" > 25 </precio> <agno> 1999 </agno> </producto>
Cada atributo puede ocurrir slo una vez por elemento Su valor es siempre una cadena de caracteres, no puede tener subelementos id : atributo especial para identificacin del elemento dentro del documento XML (tiene similitud con una Clave Primaria en BD), puede ser alfanumrico Cundo definir atributos y cundo elementos?

Bases de Datos Avanzado

Documento XML bien formado


Se dice que un documento XML est bien formado si: Sus etiquetas estn anidadas correctamente No hay atributos repetidos en un mismo elemento Solo hay un elemento raz para el documento Cumple el DTD (si lo hay) o el XML Schema (si lo hay) Sirven para establecer conexiones entre elementos Tienen similitud con las claves forneas en BD

<persona id="90"> <nombre>Pedro</nombre> <edad>25</edad> <mail>peter@123.com</mail> <hermano idrefs="100 107"/> <padre idref= "103" /> </persona> Apunta a otro elemento dentro del documento cuyo id es el 103
Bases de Datos Avanzado

Documento XML visto como un grafo


Familia id=5

Persona

id=10

Persona

id=20

Nombre Pepe

Edad 25

Hermano idref=20

Nombre Luis

Edad 35

Hermano idref=10

Bases de Datos Avanzado

Dos documentos XML diferentes:


<persona> <nombre>Pedro</nombre> <apellido>Gomez</apellido> <apellido>Gomez</apellido> <nombre>Pedro</nombre> </persona>

Otros aspectos de XML


<persona>

</persona>

Nota : Los atributos pueden tener diferente orden y los documentos se consideran iguales (siempre y cuando tengan los mismos atributos y los mismos valores en los atributos correspondientes)

<?xml version="1.0"?> XML.

Generalmente primera lnea de doc

<!-- Esto es un comentario en XML --> Bases de Datos Avanzado

Document Type Definition. (DTD)


Gramtica para un documento Un documento XML se considera vlido si: - Est bien formado - Cumple el DTD (si lo hay) Es un esquema (limitado) para representar datos Impone un orden y restricciones a los elementos
<!DOCTYPE bd[<!ELEMENT bd (persona*)> <!ELEMENT persona (nombre,edad,mail*, telefono+, padres?)> <!ATTLIST persona id ID #REQUIRED> <!ATTLIST persona nacionalidad CDATA #IMPLIED sexo (M #REQUIRED > <!ELEMENT nombre (#PCDATA) > <!ELEMENT edad (#PCDATA) > *: 0 ms <!ELEMENT mail (#PCDATA) > +: 1 ms <!ELEMENT telefono (#PCDATA) > ?: 0 1 <!ELEMENT padres EMPTY> <!ATTLIST padres madre IDREF #IMPLIED padre IDREF #IMPLIED > Bases de Datos Avanzado ]>

| F )

Ejemplo de grupos vlidos


(A, B, C) : A seguido de B seguido de C (A| B | C): Uno de los tres, exclusivo ((A | (X,Y,Z)), B, (C|D)) posibles grupos vlidos: - A, B, C - A, B, D -X, Y, Z, B, C -X, Y, Z, B, D (A, B?, C*, D+) posibles grupo vlidos: - A, D, D, ... - A, B, D, D ... - A, B, C, C..., D, D - A, C, C..., D

Bases de Datos Avanzado

Contenido de una DTD


- Definicin de Elementos - Definicin de Atributos - Entidades - Comentarios Otros aspectos: No hay tipos de datos en un DTD (en XML Schema si los hay) No se pueden definir ciertas restricciones (rangos de dominio, restringir a nmeros positivos o negativos; en XML Schema si) No hay restriccin de tipo para IDREFs (es decir un elemento puede apuntar a cualquier otro) XML Schema maneja herencia, DTD no. Aspectos DTD Los DTDs fueron diseados antes de la introduccin de namespaces Expresividad muy limitada, por ejemplo no hay forma de expresar que un elemento se compone de un # n de subelementos As y de un # m de subelementos Bs en cualquier orden Se ha desarrollado XML Schema, un lenguaje mucho ms rico para expresar la composicin de un documento XML
Bases de Datos Avanzado

Seccin CDATA
Zona de datos a la que no se le hace parsing (a diferencia de los comentarios). Permite almacenar etiquetas sin que sean interpretadas como elementos XML.
<elemento> <![CDATA[<autor>Miguel de Cervantes</autor>]]> </elemento> ENTITY Permiten reutilizar fragmentos de texto, hacer referencia a archivos externos y a archivos con fragmentos XML. Entidades predefinidas: &amp, &lt, &gt, &apos, &quot (caracteres reservados) Entidades internas (fragmentos de texto) Entidades Externas ( XML y No-XML)
Bases de Datos Avanzado

Entidades predefinidas
<ejemplo> &lt;elementohijo &gt; El hombre dijo &quot; Hello &quot; &lt;/elementohijo &gt; </ejemplo>
Es decir el contenido del elemento ejemplo es:

<elementohijo> El hombre dijo " Hello " </elementohijo>


documento

<elementohijo> No es un elemento XML en este

Bases de Datos Avanzado

Entidades internas.
<?xml version="1.0" ?> <!DOCTYPE contenido [ <!ELEMENT contenido (#PCDATA) > <!ENTITY ejemplo '&abrev; &largo;' > <!ENTITY largo 'muy larga' > <!ENTITY abrev 'Esta es una frase' > ] > <contenido> &ejemplo; &amp; un poco oscura... </contenido>

Esto genera dentro del elemento contenido: Esta es una frase muy larga & un poco oscura... Ntese que no importa el orden en que se declaren las entidades
Bases de Datos Avanzado

Entidad XML externa


<!DOCTYPE libro [ <!ENTITY libro1 SYSTEM "c:\lib1.txt" > <!ENTITY libro2 SYSTEM "lib2.xml" > <!ENTITY libro3 SYSTEM "http://www.unalmed.edu.co/lib3.xml" > ]> <libros> Las novelas de Robert Lory: <l1>&libro1;</l1> <l2>&libro2;</l2> <l3>&libro3;</l3> </libros> Con Ruta Con direct. actual Con URL

Si el archivo es texto se inserta, si es binario no (puede sacar error en algunas aplicaciones). Ntese que la ENTITY puede ser una ruta completa o una URL.
Bases de Datos Avanzado

Sea el contenido de lib1.txt: El retorno de Dracula El contenido de lib2.xml: * El Oro de Dracula Y lib3.xml: * La Mano de Dracula El resultado del archivo anterior es: <libros> Las novelas de Robert Lory: <l1>El retorno de Dracula</l1> <l2>El Oro de Dracula</l2> <l3>La Mano de Dracula</l3> </libros>
* Documentos XML no Vlido (sin raz)sirven como fragmentos XML

Bases de Datos Avanzado

Modelo mixto para un elemento.


<!ELEMENT seccion (#PCDATA | xref ) > <!ATTLIST seccion identif ID #IMPLIED> <!ELEMENT xref EMPTY> <!ATTLIST xref ref IDREF #REQUIRED>

Trozo de documento ejemplo: <seccion identif= "S1" >este es el contenido</seccion> <seccion identif= "S2" > <xref ref = "S1" /> </seccion>

Bases de Datos Avanzado

XML Namespaces1
<table> <tr> <td>Apples</td> <td>Bananas</td> </tr> </table>
<table> <name> Desk </name> <width>80</width> <length>120</length> </table>
Un elemento table que representa Una tabla HTML

Un elemento table que representa mesas

Ambos elementos usan la palabra table pero con propsitos diferentes

Bases de Datos Avanzado

XML Namespaces2
<h:table xmlns:h="tablahtml" > <h:tr> <h:td>Apples</h:td> <h:td>Bananas</h:td> </h:tr> </h:table>
<f:table xmlns:f="mesa" > <f:name>African Coffee Table</f:name> <f:width>80</f:width> <f:length>120</f:length> </f:table> Se aconseja y ha extendido mucho, el uso de namespaces tomando como base URIs, tpicamente URLs. Ejemplo: <h:table xmlns:h="http://www.alfa.org/html43"> <h:tr> <h:td>Apples</h:td> <h:td>Bananas</h:td> <h:td>Guanabanoides</h:td> </h:tr> </h:table> Bases de Datos Avanzado

Ejemplo
Se ver un ejemplo completo de un documento XML con su DTD y una hoja de estilo XSL: Bajar de la pgina del curso el archivo suspect.zip, y descomprimir. Abrir con el navegador suspect.xml Observar su cdigo fuente y ver tambin el de suspect.dtd Agregar al archivo suspect.xml la siguiente lnea <?xml-stylesheet type="text/xsl" href="suspect.xsl"?> debajo de: <?xml version="1.0"?> Visualizarlo de nuevo con el navegador Trasformacin de XML a HTML mediante XSL

Bases de Datos Avanzado

DOM: (Document Object Model): Representa el documento como un bosque compuesto de rboles, enlazados entre ellos (un grafo). Se pueden crear y destruir nodos, cambiar de posicin un nodo, recuperar subrboles, hacer un recorrido completo del documento etc. Es pobre en rendimiento para documentos XML grandes porque el rbol completo puede no caber en memoria

Procesamiento de documentos XML: Parsers1

SAX. (Simple API for XML): Se definen mtodos por cada tipo evento : inicio del documento, inicio un elemento, fin de documento, inicio atributo ,etc. No permite modificar documento, slo lectura. til para documentos XML grandes
Bases de Datos Avanzado

de de de el

Aspectos a profundizar1
1. Los esquemas XML: XML Schema 2. RDF y RQL 3. Web Services (WSDL) y SOAP 4. Un lgebra para el lenguaje de consulta 5. Los lenguajes de consulta propuestos por la W3C XQUERY y XPATH 6. El XML y las bases de datos:
- Bases de Datos dedicadas a documentos XML

7. OWL: Ontology Web Language (2004)


Bases de Datos Avanzado

- Cmo combinar el uso de las bases de datos y los documentos XML? - Cmo almacenar un documento XML en la base de datos (descomponerlo o guardarlo como un todo?) - Tipos de datos especiales para guardar documentos XML en las bases de datos (Ejemplo XMLTYPE en Oracle)

Bibliografa1
T. Bray, J. Paoli and C.M. Sperberg-Mc Queen. Extensible Markup Language. (XML) 1.0. W3C Recommendation, 10 February 1998, en http://www.w3c.org/TR/ Michard, Alain. XML langage et applications. ditions Eyrolles. Paris. Dcembre 2000. Abiteboul S., Buneman Peter, Suciu Dan. Data on the Web. From Relations to Semistructured Data and XML. Morgan Kaufmann P. San Francisco California. 2000. R. Goldman, J. McHugh, and J. Widom. From Semi structured Data to XML: Migrating the Lore Data Model and Query Language. Proceedings of the 2nd International Workshop on the Web and Databases (WebDB '99), Philadelphia, Pennsylvania, 1999. J. McHugh, S. Abiteboul, R. Goldman, D. Quass, and J. Widom. Lore: A Database Management System for Semi structured Data. SIGMOD Record, 26(3):54-66, September 1997. XML and Databases by Ronald Bourret June, 2001 http://www.rpbourret.com/xml/XMLAndDatabases.htm

Bases de Datos Avanzado

Algunas caractersticas de XML


Gasto considerable de almacenamiento El acceso a los datos puede ser lento (en especial en documentos XML enormes) Slo tipo de datos texto* Portabilidad Usado como medio de transporte e intercambio de datos

Tipos de documentos XML pueden clasificarse en:


Centrados en los Datos: - La estructura tiende a ser regular - Originados por ejemplo desde BD relacionales Centrados en el documento: - Estructura menos regular - El orden de los elementos importa A veces la distincin entre ambos tipos no es clara
* Aunque esto puede tratarse mediante XML-Schema Bases de Datos Avanzado

Tipos de Documentos XML2


El tipo de documento ayuda en la decisin de almacenar el documento XML como un todo o distribuirlo en varias tablas de la BD. Un documento XML centrado en el documento es difcil de mapear a tablas de la base de datos (muchos anidamientos, muchas tablas, recomposicin del documento difcil, muchos nulos), Adems preguntarse: Se requiere recomponer con frecuencia el documento? Interesa el orden en el que venan originalmente los elementos? Hay muchas consultas sobre el documento que recuperan fragmentos de ste? BD nativas XML Existen igualmente BD nativas XML, con unidad fundamental de almacenamiento en documento XML, as como la tupla en una BD relacional Tratan de mejorar el rendimiento y optimizar el almacenamiento Ej: eXist, Tamino, dbXML, etc Normalmente ofrecen un lenguaje de consulta para operar sobre los

documentos (XQuery, XPath, Quilt etc.) BasesXML-QL, de Datos Avanzado

Lenguajes de consulta para XML


Relaciones entre distintos lenguales de consulta

SQL
Patrones XSL XSLT XQL 98

OQL

Lorel

XML-QL
XQL 99

Xpath 1.0

Xpath 2.0

Quilt XQuery
Bases de Datos Avanzado

Estndares W3C

XPath
Uno de los lenguaje de consulta para XML Permite recuperar fragmentos de documentos XML Notacin similar a la usada en la especificacin de jerarquas de UNIX Estndar del W3C al igual que el lenguaje de consulta XQuery Usado como mecanismo de bsqueda en el lenguaje XSL Ejemplo: Ver archivo adjunto de la pgina principal del curso EjemplosXPath.zip Descomprimir y abrir el archivo: XPath

Tutorial1.html

Bases de Datos Avanzado

Ejemplo prctico: Documentos XML en un SGBD


Se mostrar cmo almacenar documentos XML dentro de una Base de Datos Oracle usando el tipo de datos XMLType Cmo validarlos contra una DTD Cmo consultarlos mediante XPath Cmo crearles ndices Cmo definir una vista relacional que oculte al usuario final el documento XML Cmo realizar validaciones del documento XML contra otras tablas de la base de datos. Ejemplo BD. Bajar el archivo Oracle_XML.doc de la pgina del curso 1. Se va a crear una tabla llamada PURCHASEORDER donde se van a guardar documentos XML enteros correspondientes a rdenes de compra. Esta tabla se compone de 2 campos: - Cdigo del documento (numrico) - Documento XML como tal (XMLType)
Bases de Datos Avanzado

Ejemplo prctico: XML en la BD


2. Ahora se va a crear una tabla llamada DTDSTORE que va a servir para almacenar DTDs. Esta tabla consta de dos campos: - Un nombre cualquiera que se le da a la DTD (carcter) - La DTD como tal (se almacenar en un CLOB) 3. Se construir un trigger para validar los documentos XML que vayan a ingresar en la tabla PURCHASEORDER contra la DTD almacenada en la tabla DTDSTORE. (Dado que en la tabla DTDSTORE existen muchas DTDs se debe buscar la que rige a los documentos XML que son rdenes de compra)
Bases de Datos Avanzado

Ejemplo prctico: XML en la BD


4. Insercin de una tupla en la tabla PURCHASEORDER 5. Consultando documentos XML desde la tabla PURCHASEORDER:
5.1 Recuperando todo el documento 5.2 Recuperando fragmentos del documento mediante el uso de Xpath 6. Creando ndices sobre los elementos de un documento XML. Se crearn ndices para los elementos:

- /PurchaseOrder/Reference ndice nico - /PurchaseOrder/User


Nota: Estos ndices se construyen sobre todas las tuplas de la tabla PURCHASEORDER, por ejemplo con el ndice nico sobre Reference se garantiza que no hayan 2 documentos XML con la misma referencia. Esta restriccin no puede ser colocada con una DTD.

Bases de Datos Avanzado

Ejemplo prctico: XML en la BD


7. Creacin de una vista a partir del documento XML. Crea la sensacin de que se est consultando un tabla relacional tpica Se crear una vista que recuperar: - El usuario de la orden (cliente): user - La referencia de la orden: reference 8. Ahora se va a introducir una validacin adicional: Verificar que el usuario que es ingresado en el documento XML exista en una tabla de clientes de la Base de Datos llamada customer. Se construir un trigger para tal efecto. En el mismo documento se observarn 2 problemas adicionales:
- Como generar XML desde una tabla de la base de datos - Como recorrer mediante DOM un documento XML en Oracle

Bases de Datos Avanzado

Lenguaje de Consulta XQuery


XQuery incorpora elementos de XPath Tiene similitudes con SQL (operadores de agregacin, ordenamiento, clusula existencial, clusula where etc.) Expresiones FLWR (Flower):
- FOR: All se definen las variables de recorrido sobre el documento mediante XPath - LET: Asignacin a variables de expresiones - WHERE: Realiza comprobaciones adicionales sobre los elementos recuperados mediante FOR. - RETURN: Permite especificar los resultados, es decir, que devuelve la consulta

Bases de Datos Avanzado

Doc: bib.xml
<bib> <book year="1994"> <title>TCP/IP Illustrated</title> <author><last>Stevens</last><first>W.</first></author> <publisher>Addison-Wesley</publisher> <price>65.95</price> </book> <book year="1999"> <title>The Economics of Technology and Content for Digital TV</title> <editor> <last>Gerbarg</last><first>Darcy</first> <affiliation>CITI</affiliation> </editor> <publisher>Kluwer Academic Publishers</publisher> <price>129.95</price> </book>
Bases de Datos Avanzado

<book year="2000"> <title>Data on the Web</title> <author><last>Abiteboul</last><first>Serge</first></author > <author><last>Buneman</last><first>Peter</first></author> <author><last>Suciu</last><first>Dan</first></author> <publisher>Morgan Kaufmann Publishers</publisher> <price>39.95</price> </book> <book year="1992"> <title>Advanced Programming</title> <author><last>Stevens</last><first>W.</first></author> <publisher>Addison-Wesley</publisher> <price>65.95</price> </book> </bib>
Bases de Datos Avanzado

XQuery :Consulta
Lista de libros publicados por la Addison-Wesley despus de 1991, incluir ao y ttulo en la respuesta:
<bib> {

for $b in doc(http://www.bn.com/bib.xml)/bib/book where $b/publisher = Addison-Wesley and $b/@year > 1991 return Resultado <book year = { $b/@year }> { $b/title } <bib> </book> <book year = 1994> } <title>TCP/IP Illustrated</title> </bib> </book> <book year = 1992> <title>Advanced Programming </title> </book> Bases de</bib> Datos Avanzado

XQuery :Consulta
<results> { for $b in doc(http://www.bn.com/bib.xml)/bib/book , $t in $b/title, Resultado $a in $b/author <results> return <result> <result> <title>Data on Web</title> <author> </author> { $t } </result> { $a } <result> </result> <title> Data on Web </title> <author> </author> } </result> </results>
</results>
Bases de Datos Avanzado

XQuery :Consulta

<results> { for $b in doc(http://www.bn.com/bib.xml)/bib/boo return <result> Resultado { $b/title } <results> { $a/author } <result> </result> <title>Data on Web</title> <author> </author> } <author> </author> </results> <author> </author>
... </results> </result>

Bases de Datos Avanzado

XQuery :Consulta Ordenamientos (order by)


<bib> { for $b in doc("http://www.bn.com./bib.xml")//book where $b/publisher = "Addison-Wesley" and $b/@year>1991 order by $b/title return Resultado <book> <bib> <book year="1992"> { $b/@year } <title>Advanced Program...</title> { $b/title } </book> </book> <book year="1994"> } <title>TC/IP Illustrated...</title> </bib> </book>
</bib>
Bases de Datos Avanzado

XML Schema
Considrese un documento XML el cual describe una hoja de pedido generada por un pedido de Productos para el Hogar y los datos de Facturacin:
<?xml version="1.0"?> <hojaPedido fechaPedido="1999-10-20"> <enviarA pais="EEUU"> <nombre>Alice Smith</nombre> <calle>123 Maple Street</calle> <ciudad>Mill Valley</ciudad> <estado>CA</estado> <zip>90952</zip> </enviarA> <facturarA pais="EEUU"> <nombre>Robert Smith</nombre> <calle>8 Oak Avenue</calle> <ciudad>Old Town</ciudad> <estado>PA</estado> <zip>95819</zip> </facturarA> Bases de Datos Avanzado <comentario>Deprisa!</comentario>

<elementos> <elemento numProducto="872-AA"> <nombreProducto> Colchn de Piedras</nombreProducto> <cantidad>1</cantidad> <precioEEUU>148.95</precioEEUU> <comentario>Es elctrico</comentario> </elemento> <elemento numProducto="926-AA"> <nombreProducto>Cuna de Adultos</nombreProducto> <cantidad>1</cantidad> <precioEEUU>39.98</precioEEUU> <fechaEnvio>1999-05-21</fechaEnvio> </elemento> </elementos> </hojaPedido>
Bases de Datos Avanzado

Explicacin
La hoja de pedido consiste del elemento raz, hojaPedido y los subelementos: enviarA, facturarA, comentario y elementos Estos subelementos (excepto comentario) adems contienen otros subelementos, y as sucesivamente, hasta que un subelemento, como precioEEUU, contiene un nmero en vez de ms subelementos (hojas) Los elementos que contienen subelementos o tienen atributos son denominados tipos complejos, mientras que los elementos que contienen nmeros (o cadenas o fechas, etc.) pero no contienen subelementos se denominan tipos simples Los atributos siempre tienen tipos simples Esquema de la hoja de Pedido Los tipos complejos y algunos de los tipos simples, se definen en el XML Schema para las hojas de pedido Los dems tipos simples estn definidos como parte del repertorio de tipos simples predefinidos de XML Schema El esquema de la hoja de pedido se muestra a continuacin po.xsd:
Bases de Datos Avanzado

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:annotation> <xsd:documentation xml:lang="es">Esq.Pedido</xsd:documentation> </xsd:annotation> <xsd:element name="hojaPedido" type="TipoHojaPedido"/> <xsd:element name="comentario" type="xsd:string"/> <xsd:complexType name="TipoHojaPedido"> <xsd:sequence> <xsd:element name="enviarA" type="direccionEEUU"/> <xsd:element name="facturarA" type="direccionEEUU"/> <xsd:element ref="comentario" minOccurs="0"/> <xsd:element name="elementos" type="Elementos"/> </xsd:sequence> <xsd:attribute name="fechaPedido" type="xsd:date"/> </xsd:complexType>
Bases de Datos Avanzado

<xsd:complexType name="direccionEEUU"> <xsd:sequence> <xsd:element name="nombre" type="xsd:string"/> <xsd:element name="calle" type="xsd:string"/> <xsd:element name="ciudad" type="xsd:string"/> <xsd:element name="estado" type="xsd:string"/> <xsd:element name="zip" type="xsd:decimal"/> </xsd:sequence> <xsd:attribute name="pais" type="xsd:NMTOKEN"fixed="EEUU"/> </xsd:complexType>

Bases de Datos Avanzado

<xsd:complexType name="Elementos"> <xsd:sequence> <xsd:element name="elemento" minOccurs="0" maxOccurs="unbounded <xsd:complexType> <xsd:sequence> <xsd:element name="nombreProducto" type="xsd:string"/> <xsd:element name="cantidad"> <xsd:simpleType> <xsd:restriction base="xsd:positiveInteger"> <xsd:maxExclusive value="100"/> </xsd:restriction> </xsd:simpleType> </xsd:element>

Bases de Datos Avanzado

<xsd:element name="precioEEUU" type="xsd:decimal"/> <xsd:element ref="comentario" minOccurs="0"/> <xsd:element name="fechaEnvio" type="xsd:date" minOccurs="0"/> </xsd:sequence> <xsd:attribute name="numProducto" type="SKU" use="required"/> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType>

Bases de Datos Avanzado

<!-- un cdigo para identificar productos --> <xsd:simpleType name="SKU"> <xsd:restriction base="xsd:string"> <xsd:pattern value="\d{3}-[A-Z]{2}"/> </xsd:restriction> </xsd:simpleType> </xsd:schema>

Bases de Datos Avanzado

You might also like