Escolar Documentos
Profissional Documentos
Cultura Documentos
Practica
Java.
Opcin A: Realizar un programa Java que permita regenerar un esquema de base de datos que fue exportado anteriormente con el programa PL/SQL realizado en la primera prctica.
Grupo: Daniel Gonzlez Postigo. Guillermo Garca Martn Pablo Garca Andrs Sandro Guerrero Duarte
Interfaz
En la interfaz bsicamente es donde nosotros especificamos nuestros datos de conexin a la base de datos, y donde seleccionaremos el fichero XML a cargar . Para ello nos vamos a Archivo -> Abrir o usamos el comando rpido Ctrl+o y nos aparecer una ventana de exploracin donde podremos elegir nuestro fichero.
emplea mas de una columna , por ejemplo primary key compuesta o foreign key compuesta. public class Atributo { private String nombre; private String tipo; private String longitud; En nombre almacenamos el nombre del atributo, en tipo el tipo de variable que almacena el atributo , y su longitud en caso de que tenga. Todas las restricciones son almacenadas en una estructura tal que as: restricciones = new HashSet<Restriccion>(); Y las tablas con sus atributos en una estructura tal que as: tablas= new HashMap<String,Set<Atributo>>(); De esta forma para crear nuestras tablas, lo primero que hacemos es crear las tablas con sus respectivos atributos. Para ello creamos un parte genrica que ser CREATE TABLE <NOM_TABLA>( <NOM_ATRIBUTO><TIPO><LONGITUD>, ) Y vamos iterando por el map hasta crear todas las tablas con sus atributos. Lo hacemos con el siguiente cdigo: String comando="CREATE TABLE "+e.getKey()+ "("; String Atributos=""; Set<Atributo> aux = (Set<Atributo>) e.getValue(); Iterator it = aux.iterator(); Atributo elem; elem=(Atributo) it.next(); if(elem.getTipo().compareToIgnoreCase("")==0 || elem.getTipo().compareToIgnoreCase("DATE")==0) { Atributos=Atributos+" \n"+elem.getNombre()+" "+elem.getTipo(); //Atributos sin tamao especifico } else
{ Atributos=Atributos+" \n"+elem.getNombre()+" "+elem.getTipo() + "(" + elem.getLongitud()+ ")"; } while(it.hasNext()) { elem=(Atributo) it.next(); if(elem.getTipo().compareToIgnoreCase("")==0 || elem.getTipo().compareToIgnoreCase("DATE")==0) { Atributos=Atributos+", \n"+elem.getNombre()+" "+elem.getTipo(); //Atributos sin tamao especifico } else { Atributos=Atributos+",\n"+elem.getNombre()+" "+elem.getTipo() + "(" + elem.getLongitud()+ ")"; } } comando=comando+Atributos+")"; Una vez hemos creado todas las tablas con sus atributos, creamos nuestras restricciones con un cierto orden. La principal importancia era crear las Primary key antes que las Foreing key pues nos produce un error si referenciamos a una tabla la cual no contiene una Primary. Para crear las restricciones iteramos a lo largo del set de restricciones y clasificando las restricciones por su Tipo de esta forma podemos priorizar unas sobre otras. if(res.getTipo().compareToIgnoreCase("C")==0) { comando="ALTER TABLE "+res.getTabla()+" MODIFY ("; comando=comando + " CONSTRAINT " + res.getNombre() + " CHECK(" + res.getCondicion() + ")" ;
comando=comando+" ) "; System.out.println(comando); //Deteccin de errores y envio del comando. } else if (res.getTipo().compareToIgnoreCase("U")==0) { comando="ALTER TABLE "+res.getTabla()+" MODIFY ("; Iterator ite = res.getColumnas().iterator(); comando= comando + " " + ite.next() + " CONSTRAINT " + res.getNombre() + " UNIQUE "; comando=comando+" ) "; System.out.println(comando); //Deteccin de errores y envio del comando. } else if (res.getTipo().compareToIgnoreCase("P")==0) { comando="ALTER TABLE "+res.getTabla()+" MODIFY ("; comando= comando + " CONSTRAINT " + res.getNombre() + " PRIMARY KEY("; Iterator itt= res.getColumnas().iterator(); comando=comando+" "+ itt.next(); while(itt.hasNext()) { comando=comando+", "+ itt.next(); } comando=comando+" )"; comando=comando+" ) "; System.out.println(comando); //Deteccin de errores y envo del comando. } public void CreaForeign(Restriccion res) throws SQLException { if (res.getTipo().compareToIgnoreCase("R")==0) { String comando="ALTER TABLE "+res.getTabla()+" MODIFY (";
comando=comando+" CONSTRAINT "+ res.getNombre() + " FOREIGN KEY(" ; Iterator Ite= res.getColumnas().iterator(); comando=comando+Ite.next(); while(Ite.hasNext()) { comando=comando+","+Ite.next(); } comando=comando+ ")"+" REFERENCES "+ res.getTablaRef(); comando=comando+" ) "; System.out.println(comando); //Deteccin de errores y envo de comando. }
Deteccin
de
errores.
Los
errores
principales
que
detectamos
y
avisamos
son
el
caso
de
que
ya
existiera
una
tabla
con
ese
nombre,
restricciones
con
el
mismo
nombre
,
Primary
key
con
ese
mismo
nombre
.
Estos
errores
los
controlamos
debido
a
que
al
volcar
la
base
de
datos
tambin
almacenamos
los
nombres,
y
aprovechando
esto
tambin
los
cargamos.
El
error
955:
Es
el
error
de
creacin
de
tabla
con
un
nombre
que
ya
existe.
try
{
try
{
rset
=
stmt.executeQuery(comando);
}
catch(java.sql.SQLSyntaxErrorException
errnom){
if
(errnom.getErrorCode()==955)
{
System.out.println(errnom.getErrorCode());
MostrarErrores(errnom.toString());
}
}
El primer try se encarga de controlar las excepciones diferentes a la 955 que es la que controlamos en este caso. El error 2264: Es el error de creacin de una restriccin con un nombre que ya existe. El error 2261: Es el error de creacin de una Primary Key con un nombre que ya existe. try { try { rset = stmt.executeQuery(comando); } catch (SQLSyntaxErrorException ex) { if (ex.getErrorCode()==2264) { this.jrestricc.setVisible(true); this.jrestricc.setTitle("Error: Restriccin existente"); } else if (ex.getErrorCode()==2261) { this.jPrimary.setVisible(true); } } }
Posibles
mejoras
-Como
posibles
mejoras
se
podra
hacer
que
no
almacenara
los
nombres
de
las
constraints
de
esta
forma
evitaramos
la
colisiones
de
nombres.
-Ejecucin
de
procesos
empleando
threads.