jump to navigation

Copiar tablas entre bases de datos febrero 22, 2007

Posted by superpiwi in Java.
trackback

Hoy dos pequeñas clases para realizar el volcado de datos de una serie de tablas entre dos bases de datos. Para que funcione en ambas bases de datos tenemos que tener ya creado el modelo y debe coincidir es decir, usar el mismo nombre de tablas y nombre de columnas.

Ya se que existen otras opciones como usar export/import de bases de datos, o generar scripts SQL, pero no siempre es posible usar estas opciones o simplemente necesitas algo rapido para copiar datos entre bases de datos que son distintas.

Aqui las clases Migracion.java y DatabaseUtil.java.


/**
* Clase de utilidad para copiar tablas de una base de datos origen a una destino
*
* @author jdelgado
* @version 0.0.0.1 - 21 Feb 2007 (a partir de codigo de 2004)
*
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.StringTokenizer;
import java.util.Properties;
import java.io.File;
import java.io.FileInputStream;
//-- version sin log4J para poder compilarlo con gcj.
// si quieres usar log4j descomenta las lineas comentadas a continuacion y en los metodos debug y error.
//import org.apache.log4j.Logger;
public class Migracion
{
/**
* Activar / desactivar trazas
*/
static public boolean verbose=false;
/**
* Propiedades de conexion
*/
public String odriver,ouser,opass,ourl,oschema,otables,ddriver,duser,dpass,durl,dschema;
/**
* Trazas
*/
// descomenta esta linea si quieres usar log4j
//private static final Logger logger = Logger.getLogger(Migracion.class);
/**
* Constructror
* @param odriver nombre driver jdbc para origen
* @param ouser usuario de base de datos origen
* @param opass password de base de datos origen
* @param ourl url jdbc origen
* @param oschema schema origen (opcional)
* @param otables una lista separada por ',' de las tablas a migrar
* @param ddriver nombre driver jdbc para destino
* @param duser usuario de base de datos destino
* @param dpass password de base de datos destino
* @param durl url jdbc destino
* @param dschema schema destino (opcional)
*
* Nota: el modelo de datos debe existir en ambas bases de datos, el proceso de migracion no crea
* las tablas, y los nombres de tablas y columnas deben coincidir.
*/
public Migracion(String odriver,String ouser,String opass,String ourl,String oschema,String otables,String ddriver,String duser,String dpass,String durl,String dschema)
{
this.odriver = odriver;
this.ouser = ouser;
this.opass = opass;
this.ourl = ourl;
this.oschema = oschema;
this.otables = otables;
this.ddriver = ddriver;
this.duser = duser;
this.dpass = dpass;
this.durl = durl;
this.dschema = dschema;
}
//----
/**
* Constructor
* @param pathname ruta del fichero con las propiedades
* @throws Excepcion excepcion levantada en caso de error
*/
public Migracion(String pathname) throws Exception
{
this.leerProperties(pathname);
}
//----
public void imprimirParametros()
{
Migracion.debug(Migracion.class.getName(), "imprimirParametros", "SOURCE_DRIVER: "+this.odriver, 6, null, null);
Migracion.debug(Migracion.class.getName(), "imprimirParametros", "SOURCE_URL: "+this.ourl, 6, null, null);
Migracion.debug(Migracion.class.getName(), "imprimirParametros", "SOURCE_TABLES: "+this.otables, 6, null, null);
Migracion.debug(Migracion.class.getName(), "imprimirParametros", "TARGET_DRIVER: "+this.ddriver, 6, null, null);
Migracion.debug(Migracion.class.getName(), "imprimirParametros", "TARGET_URL: "+this.durl, 6, null, null);
}
/**
* Inicia el proceso de volcado de tablas.
* @return un pequeño informe con los tiempos de ejecucion.
* @throws Exception excepcion levantada en caso de error.
*/
public String migrar() throws Exception
{
Connection ORIGEN=null;
Connection DESTINO=null;
DatabaseUtil util = null;
try
{
imprimirParametros();
Migracion.debug(Migracion.class.getName(), "migrar", "@obtener conexiones", 6, null, null);
Class.forName(this.odriver);
ORIGEN=DriverManager.getConnection(this.ourl,this.ouser,this.opass);
Migracion.debug(Migracion.class.getName(), "migrar", "conexion origen:"+ORIGEN, 6, null, null);
Class.forName(this.ddriver);
DESTINO=DriverManager.getConnection(this.durl,this.duser,this.dpass);
Migracion.debug(Migracion.class.getName(), "migrar", "conexion destino:"+DESTINO, 6, null, null);
// Iniciar transaccion
Migracion.debug(Migracion.class.getName(), "migrar", "@Procesar tablas", 6, null, null);
util = new DatabaseUtil();
util.setVerbose(verbose);
// obtener tablas
StringTokenizer st = new StringTokenizer(this.otables,",");
while (st.hasMoreTokens())
{
String TABLENAME = st.nextToken();
Migracion.debug(Migracion.class.getName(), "migrar", "Procesando tabla:"+TABLENAME+"...", 6, null, null);
// Copiar el contenido de la tabla desde la base de datos origen a destino, borrando la tabla en el destino previamente
util.copyTable(TABLENAME, ORIGEN, DESTINO, true, null);
}
return util.getSb().toString();
}
catch(Exception e)
{
throw e;
}
finally
{
try
{
if (ORIGEN!=null) ORIGEN.close();
}
catch(Exception f)
{
;
}
try
{
if (DESTINO!=null) DESTINO.close();
}
catch(Exception f)
{
;
}
}
}
//----
/**
* Para mostrar un error si falta algun properties
* @param key valor de la clave
* @param name nombre de la clave
* @throws Exception excepcion levantada en caso de error
*/
public void existe(String key,String name) throws Exception
{
if (key==null) throw new Exception("clave ["+name+"] no encontrada en el fichero de propiedades");
}
//----
/**
* Leer las propiedades de conexion desde fichero
* @throws Excepcion excepcion levantada en caso de error
*/
public void leerProperties(String pathname) throws Exception
{
Properties p = null;
FileInputStream fin = null;
try
{
// leemos el contenido del fichero y lo cargamos en el properties
String FILENAME=pathname;
File f = new File(FILENAME);
if (!f.exists()) throw new Exception ("El fichero \'"+pathname+"\' no existe");
//InputStream is = getClass().getResourceAsStream(FILENAME);
fin = new FileInputStream(f);
p = new Properties();
p.load(fin);
// recuperamos las propiedades y las asignamos a la clase
String SOURCE_DRIVER = p.getProperty("SOURCE_DRIVER");
String SOURCE_URL = p.getProperty("SOURCE_URL");
String SOURCE_USER = p.getProperty("SOURCE_USER");
String SOURCE_PASSWORD = p.getProperty("SOURCE_PASSWORD");
String SOURCE_SCHEMA = p.getProperty("SOURCE_SCHEMA");
String SOURCE_TABLES = p.getProperty("SOURCE_TABLES");
String TARGET_DRIVER = p.getProperty("TARGET_DRIVER");
String TARGET_URL = p.getProperty("TARGET_URL");
String TARGET_USER = p.getProperty("TARGET_USER");
String TARGET_PASSWORD = p.getProperty("TARGET_PASSWORD");
String TARGET_SCHEMA = p.getProperty("TARGET_SCHEMA");
// chequeos de valores nulos
existe(SOURCE_DRIVER,"SOURCE_DRIVER");
existe(SOURCE_URL,"SOURCE_URL");
existe(SOURCE_USER,"SOURCE_USER");
existe(SOURCE_PASSWORD,"SOURCE_PASSWORD");
existe(SOURCE_TABLES,"SOURCE_TABLES");
existe(TARGET_DRIVER,"TARGET_DRIVER");
existe(TARGET_URL,"TARGET_URL");
existe(TARGET_USER,"TARGET_USER");
existe(TARGET_PASSWORD,"TARGET_PASSWORD");
// asignamos las propiedades leidas a los atributos de la clase
this.odriver = SOURCE_DRIVER;
this.ourl = SOURCE_URL;
this.ouser = SOURCE_USER;
this.opass = SOURCE_PASSWORD;
this.oschema = SOURCE_SCHEMA;
this.otables = SOURCE_TABLES;
this.ddriver = TARGET_DRIVER;
this.durl = TARGET_URL;
this.duser = TARGET_USER;
this.dpass = TARGET_PASSWORD;
}
catch(Exception e)
{
throw e;
}
finally
{
try
{
if (fin!=null) fin.close();
}
catch(Exception f)
{
;
}
}
}
//----
/**
* Para probar el correcto funcionamiento de la clase de ejemplo
* @param args argumentos de entrada
*/
public static void main(String[] args) {
try
{
String TABLAS="TABLA1,TABLA2,TABLA3";
/*
Migracion m = new Migracion(
"oracle.jdbc.driver.OracleDriver",
"tu_user",
"tu_password",
"jdbc:oracle:thin:@tu_hostname:1521:tu_basedatos",
null,
TABLAS,
"oracle.jdbc.driver.OracleDriver",
"tu_user",
"tu_password",
"jdbc:oracle:thin:@tu_hostname.hi.inet:1521:tu_basedatos",
null);
m.migrar();
*/
// comprobar parametros
int num_argumentos = args.length;
if (num_argumentos < 2)
{
System.out.println("migrar: copia las tablas especificadas desde una base de datos origen a una base de datos destino.");
System.out.println("sintaxis: migrar -file <fichero de configuracion> [-verbose]");
}
else
{
String argumento1 = args[0];
String argumento2 = args[1];
String argumento3 = "";
if (num_argumentos>2) argumento3 = args[2];
if (!argumento1.equalsIgnoreCase("-file"))
{
System.out.println("Parametro incorrecto");
System.out.println("sintaxis: migrar -file <fichero de configuracion> [-verbose]");
}
else
{
if (argumento3.equalsIgnoreCase("-verbose"))
{
//System.out.println("activado trazas del proceso (verbose)");
Migracion.verbose = true;
Migracion.debug(Migracion.class.getName(), "main", "activado trazas del proceso (verbose)", 6, null, null);
}
long time = System.currentTimeMillis();
Migracion m = new Migracion(argumento2);
String report = m.migrar();
long time_end = System.currentTimeMillis();
long total = time_end-time;
System.out.println("\r\nMigracion terminada\r\n-------------------\r\n");
System.out.println(report);
System.out.println("Process Total Time: "+total+" ms");
}
}
}
catch(Exception e)
{
//e.printStackTrace();
String ERROR = e.toString();
System.out.println(ERROR);
}
}
//----
/**
* Imprime un mensaje de traza.
* @param nombre de la clase clase donde se genera el mensaje.
* @param metodo nombre del metodo donde se genera el mensaje.
* @param mensaje texto del mensaje.
* @param prioridad prioridad del mensaje.
* @param user usuario del mensaje.
* @param parameters parametros del mensaje.
*/
static public void debug(String clase,String metodo,String mensaje,int prioridad,String user,Object parameters)
{
if (verbose)
{
//if (logger.isDebugEnabled())
//{
String MENSAJE = "["+clase+"] ["+metodo+"] : "+mensaje;
System.out.println(MENSAJE);
//logger.debug(MENSAJE);
//}
}
}
//--------------------------------------------
}
//end of class Migracion.java


/**
* DatabaseUtil.java
*
* Utileria para bases de datos
*
* @author jdelgado
* @version 1.0 - 31/05/2004
* @revision 1.1 - 21/02/2007
*
* @since JDK 1.4.1_02 - Eclipse 3 release M8
* @since revision JDK 1.5 - Eclipse 3.2
*
* TODO: sustituir metodo para recuperar nombres de columnas de las tablas no mediante SQL sino introspeccion
* en la base de datos
*
* */
import java.sql.*;
import java.util.Vector;
import java.io.*;
//-- version sin log4J para poder compilarlo con gcj.
// si quieres utilizar log4j descomenta las lineas
//import org.apache.log4j.Logger;
public class DatabaseUtil
{
/**
* Trazas
*/
//private static final Logger logger = Logger.getLogger(DatabaseUtil.class);
/**
* Activar / desactivar trazas
*/
static public boolean verbose=false;
/**
* report
*/
StringBuffer sb = new StringBuffer();
/**
* Copia el contenido de una tabla desde una base de datos origen a una base de datos destino.(NOTA: NO SE CIERRAN LAS CONEXIONES).
*
* @param tablename nombre de la tabla que se quiere copiar.
* @param source conexion origen conexion con la base de datos origen.
* @param target conexion conexion con la base de datos destino.
* @throws Exception excepcion levantada en caso de error.
*/
public void copyTable(String tablename, Connection source, Connection target, boolean deleteTarget,FileOutputStream out)
throws Exception
{
ResultSet rs = null;
Statement stmt = null;
ResultSetMetaData metadata = null;
String[] columnas = null;
Vector valores = null;
Vector SENTENCIAS_A_EJECUTAR = null;
Statement stmt2 = null;
String tablename2 = null;
int[] resultados=null;
try
{
tablename2 = tablename;
// crear conexion con el origen.
DatabaseUtil.debug(DatabaseUtil.class.getName(), "copyTable", "creando conexion con el origen...", 6, null, null);
try
{
stmt = source.createStatement();
}
catch(Exception e)
{
String error = e.getMessage();
DatabaseUtil.error(DatabaseUtil.class.getName(), "copyTable", "No se pudo establecer la conexion con el origen : "+error, 6, null, null);
throw new Exception("No se pudo establecer la conexion origen : "+error);
}
DatabaseUtil.debug(DatabaseUtil.class.getName(), "copyTable", "creando origen creada...", 6, null, null);
// crear conexion con el destino.
DatabaseUtil.debug(DatabaseUtil.class.getName(), "copyTable", "creando conexion con el destino...", 6, null, null);
try
{
stmt2 = target.createStatement();
}
catch(Exception e)
{
String error = e.getMessage();
DatabaseUtil.error(DatabaseUtil.class.getName(), "copyTable", "No se pudo establecer la conexion con el destino : "+error, 6, null, null);
throw new Exception("No se pudo establecer la conexion destino : "+e.getMessage());
}
DatabaseUtil.debug(DatabaseUtil.class.getName(), "copyTable", "creando destino creada...", 6, null, null);
// Contabilizar el numero de registros
String SENTENCIA_SQL = "SELECT COUNT(*) FROM "+tablename;
rs = stmt.executeQuery(SENTENCIA_SQL);
rs.next();
String numero_registros = rs.getString(1);
if (rs!=null) rs.close();
// TODO: cambiar esta parte pq funciona pero no es adecuada, hay una clase que nos devuelve el metadato de columnas de una tabla
// sin necesidad de emplear el SELECT * sino directamente analizando el esquema de la base de datos
// ejecutar la consulta para recuperar los nombres de las columnas.
SENTENCIA_SQL = "SELECT * FROM "+tablename;
rs = stmt.executeQuery(SENTENCIA_SQL);
// recuperamos los metadatos
metadata = rs.getMetaData();
int numero_columnas = metadata.getColumnCount();
DatabaseUtil.debug(DatabaseUtil.class.getName(), "copyTable", "La tabla tiene "+numero_columnas+" columnas", 6, null, null);
// las almacenamos en un Array de Strings.
columnas = new String[numero_columnas];
for (int i=1; i SQL anterior: ["+sentencia_anterior+"]", 6, null, null);
DatabaseUtil.debug(DatabaseUtil.class.getName(), "imprimeSQL", "==> SQL: ["+sentencia+"]", 6, null, null);
}
catch(Exception e)
{
DatabaseUtil.error(DatabaseUtil.class.getName(), "imprimeSQL", "No se ha podido recuperar la informacion de las sentencias SQL", 6, null, null);
}
}
//----
/**
* Imprime un mensaje de traza.
* @param nombre de la clase clase donde se genera el mensaje.
* @param metodo nombre del metodo donde se genera el mensaje.
* @param mensaje texto del mensaje.
* @param prioridad prioridad del mensaje.
* @param user usuario del mensaje.
* @param parameters parametros del mensaje.
*/
static public void debug(String clase,String metodo,String mensaje,int prioridad,String user,Object parameters)
{
if (verbose)
{
//if (logger.isDebugEnabled())
//{
String MENSAJE = "["+clase+"] ["+metodo+"] : "+mensaje;
//logger.debug(MENSAJE);
System.out.println(MENSAJE);
//}
}
}
//--------------------------------------------
/**
* Imprime un mensaje de error.
* @param nombre de la clase clase donde se genera el mensaje.
* @param metodo nombre del metodo donde se genera el mensaje.
* @param mensaje texto del mensaje.
* @param prioridad prioridad del mensaje.
* @param user usuario del mensaje.
* @param parameters parametros del mensaje.
*/
static public void error(String clase,String metodo,String mensaje,int prioridad,String user,Object parameters)
{
if (verbose)
{
//if (logger.isDebugEnabled())
//{
String MENSAJE = "["+clase+"] ["+metodo+"] : "+mensaje;
//logger.error(MENSAJE);
System.out.println(MENSAJE);
//}
}
}
//--------------------------------------------
public static boolean isVerbose() {
return verbose;
}
public static void setVerbose(boolean verbose) {
DatabaseUtil.verbose = verbose;
}
public StringBuffer getSb() {
return sb;
}
}
//end of DatabaseUtil.java

Puedes pasar los parametros de conexion directamente a la clase, pero la forma general de utilizarlo es especificar un fichero de properties con el parametro -file

La sintaxis es:


Migracion -file <fichero de propiedades> [-verbose]

si indicas el flag -verbose se activa la traza y te muestra por consola el resultado de la ejecucion.

La salida es similar a lo siguiente:

copiatablas01.jpg

En el fichero de propiedades tienes que indicar los siguientes valores:


# Fichero de propiedades para la migracion de tablas
#Base de datos origen
SOURCE_DRIVER=oracle.jdbc.driver.OracleDriver
SOURCE_URL=jdbc:oracle:thin:@<hostname>:1521:<database>
SOURCE_USER=<user>
SOURCE_PASSWORD=<password>
#Tablas a copiar
SOURCE_TABLES=TABLA1,TABLA2,...,TABLAN (lista de tablas separadas por ,)
#Base de datos destino
TARGET_DRIVER=oracle.jdbc.driver.OracleDriver
TARGET_URL=jdbc:oracle:thin:@<hotname>:1521:<database>
TARGET_USER=<user>
TARGET_PASSWORD=<password>
(Sustituyelos por tus valores)

Otra opcion si utilizas el IDE Eclipse es instalar el plugin DbCopy

http://dbcopy.sourceforge.net/en/dbcopy/index.html

example2dbcopy.jpg

Si usas Log4J te dejo un ejemplo de properties para el proceso de migracion:


# initialise root logger with level DEBUG and call it BLAH
log4j.rootLogger=DEBUG, BLAH, DebugAppender
# add a ConsoleAppender to the logger BLAH
log4j.appender.BLAH=org.apache.log4j.ConsoleAppender
# set set that layout to be SimpleLayout
#log4j.appender.BLAH.layout=org.apache.log4j.SimpleLayout
log4j.appender.BLAH.layout=org.apache.log4j.PatternLayout
log4j.appender.BLAH.layout.ConversionPattern=%d %m %n
#log4j.appender.DebugAppender=org.apache.log4j.RollingFileAppender
#log4j.appender.DebugAppender.File=/tmp/migracion.log
#log4j.appender.DebugAppender.MaxFileSize=500KB
#log4j.appender.DebugAppender.MaxBackupIndex=10
#log4j.appender.DebugAppender.layout=org.apache.log4j.PatternLayout
#log4j.appender.DebugAppender.layout.ConversionPattern=%c %d{ISO8601} -- %p -- %m%n
#log4j.appender.DebugAppender.Threshold=DEBUG

ACTUALIZACION:

En los comentarios, me comenta que el codigo esta mal, es un problema al copiar y pegar. Aqui pego una version nueva, aunque no definitiva pues posteare de nuevo esta clase cuando la examine mejor:
He abandonado temporalmente este proyecto porque el objetivo que tenia era migrar de Oracle a MySQL y eso ya lo he realizado con el MySQL Oracle Migration, asi que si algun dia completo este codigo solo sera como Ejemplo.


/**
* DatabaseUtil.java
*
* Utileria para bases de datos
*
* @author jdelgado
* @version 1.0 - 31/05/2004
* @revision 1.1 - 21/02/2007
*
* @since JDK 1.4.1_02 - Eclipse 3 release M8
* @since revision JDK 1.5 - Eclipse 3.2
*
* TODO: sustituir metodo para recuperar nombres de columnas de las tablas no mediante SQL sino introspeccion
* en la base de datos
*
* */
import java.sql.*;
import java.util.Vector;
import java.io.*;
//– version sin log4J para poder compilarlo con gcj.
// si quieres utilizar log4j descomenta las lineas
//import org.apache.log4j.Logger;
public class DatabaseUtil
{
/**
* Trazas
*/
//private static final Logger logger = Logger.getLogger(DatabaseUtil.class);
/**
* Activar / desactivar trazas
*/
static public boolean verbose=false;
/**
* report
*/
StringBuffer sb = new StringBuffer();
/**
* Copia el contenido de una tabla desde una base de datos origen a una base de datos destino.(NOTA: NO SE CIERRAN LAS CONEXIONES).
*
* @param tablename nombre de la tabla que se quiere copiar.
* @param source conexion origen conexion con la base de datos origen.
* @param target conexion conexion con la base de datos destino.
* @throws Exception excepcion levantada en caso de error.
*/
public void copyTable(String tablename, Connection source, Connection target, boolean deleteTarget,FileOutputStream out)
throws Exception
{
ResultSet rs = null;
Statement stmt = null;
ResultSetMetaData metadata = null;
String[] columnas = null;
Vector valores = null;
Vector SENTENCIAS_A_EJECUTAR = null;
Statement stmt2 = null;
String tablename2 = null;
int[] resultados=null;
try
{
tablename2 = tablename;
// crear conexion con el origen.
DatabaseUtil.debug(DatabaseUtil.class.getName(), "copyTable", "creando conexion con el origen…", 6, null, null);
try
{
stmt = source.createStatement();
}
catch(Exception e)
{
String error = e.getMessage();
DatabaseUtil.error(DatabaseUtil.class.getName(), "copyTable", "No se pudo establecer la conexion con el origen : "+error, 6, null, null);
throw new Exception("No se pudo establecer la conexion origen : "+error);
}
DatabaseUtil.debug(DatabaseUtil.class.getName(), "copyTable", "creando origen creada…", 6, null, null);
// crear conexion con el destino.
DatabaseUtil.debug(DatabaseUtil.class.getName(), "copyTable", "creando conexion con el destino…", 6, null, null);
try
{
stmt2 = target.createStatement();
}
catch(Exception e)
{
String error = e.getMessage();
DatabaseUtil.error(DatabaseUtil.class.getName(), "copyTable", "No se pudo establecer la conexion con el destino : "+error, 6, null, null);
throw new Exception("No se pudo establecer la conexion destino : "+e.getMessage());
}
DatabaseUtil.debug(DatabaseUtil.class.getName(), "copyTable", "creando destino creada…", 6, null, null);
// Contabilizar el numero de registros
String SENTENCIA_SQL = "SELECT COUNT(*) FROM "+tablename;
rs = stmt.executeQuery(SENTENCIA_SQL);
rs.next();
String numero_registros = rs.getString(1);
if (rs!=null) rs.close();
// TODO: cambiar esta parte pq funciona pero no es adecuada, hay una clase que nos devuelve el metadato de columnas de una tabla
// sin necesidad de emplear el SELECT * sino directamente analizando el esquema de la base de datos
// ejecutar la consulta para recuperar los nombres de las columnas.
SENTENCIA_SQL = "SELECT * FROM "+tablename;
rs = stmt.executeQuery(SENTENCIA_SQL);
// recuperamos los metadatos
metadata = rs.getMetaData();
int numero_columnas = metadata.getColumnCount();
DatabaseUtil.debug(DatabaseUtil.class.getName(), "copyTable", "La tabla tiene "+numero_columnas+" columnas", 6, null, null);
// las almacenamos en un Array de Strings.
columnas = new String[numero_columnas];
// las añadimos a un Array de Strings.
columnas = new String[numero_columnas];
for (int i=1; i<=numero_columnas;i++)
{
String columna = metadata.getColumnName(i);
columnas[i-1] = columna;
}
// Construimos los INSERTs...
SENTENCIAS_A_EJECUTAR = new Vector();
while (rs.next())
{String INSERT = "INSERT INTO "+tablename2+"(";
// recuperamos el valor de todos los registros...
valores = new Vector();
for (int j=1;j<=numero_columnas;j++)
{
INSERT=INSERT+""+columnas[j-1]+",";
String dato = rs.getString(columnas[j-1]);
if (dato==null) dato="";
if (dato!=null)
{
// esto se hace para evitar errores a la hora de insertar campos numericos.
if (dato.equals("null")) dato="";
}
valores.add(dato);
}
//end for
if (INSERT.endsWith(",")) INSERT=INSERT.substring(0,INSERT.length()-1);
INSERT=INSERT+") VALUES (";
// Insertamos los valores...
for (int k=0;k<valores.size();k++)
{
String valor = (String) valores.elementAt(k);
//
// BUG: se evita la insercion de valores que contengan "'" para ello se escapa el campo "''".
//
//valor = Replacement.escape(valor);
INSERT = INSERT+"'"+valor+"',";
}
if (INSERT.endsWith(",")) INSERT=INSERT.substring(0,INSERT.length()-1);
INSERT=INSERT+")";
// String tenemos la sentencia INSERT que añadimos a un vector de sentencias...
SENTENCIAS_A_EJECUTAR.addElement(INSERT);
}
// Ejecutamos los insert como un lote.
int num_sentencias = SENTENCIAS_A_EJECUTAR.size();
if (deleteTarget)
{
String DELETE = "DELETE FROM "+tablename2;
stmt2.addBatch(DELETE);
}
for (int i=0;i<num_sentencias;i++)
{
String SENTENCIA = (String) SENTENCIAS_A_EJECUTAR.elementAt(i);
stmt2.addBatch(SENTENCIA);
}
resultados = stmt2.executeBatch();
/*
String RESULTADOS = "";
for (int i=0; i<resultados.length; i++)
{
String resultado = (String) String.valueOf( resultados[i] );
RESULTADOS = RESULTADOS+","+resultado;
}
if (RESULTADOS.startsWith(",")) {RESULTADOS = RESULTADOS.substring(1,RESULTADOS.length());}
*/
}
catch(Exception e)
{
DatabaseUtil.error(DatabaseUtil.class.getName(), "imprimeSQL", "No se ha podido recuperar la informacion de las sentencias SQL", 6, null, null);
}
}
//—-
/**
* Imprime un mensaje de traza.
* @param nombre de la clase clase donde se genera el mensaje.
* @param metodo nombre del metodo donde se genera el mensaje.
* @param mensaje texto del mensaje.
* @param prioridad prioridad del mensaje.
* @param user usuario del mensaje.
* @param parameters parametros del mensaje.
*/
static public void debug(String clase,String metodo,String mensaje,int prioridad,String user,Object parameters)
{
if (verbose)
{
//if (logger.isDebugEnabled())
//{
String MENSAJE = "["+clase+"] ["+metodo+"] : "+mensaje;
//logger.debug(MENSAJE);
System.out.println(MENSAJE);
//}
}
}
//——————————————–
/**
* Imprime un mensaje de error.
* @param nombre de la clase clase donde se genera el mensaje.
* @param metodo nombre del metodo donde se genera el mensaje.
* @param mensaje texto del mensaje.
* @param prioridad prioridad del mensaje.
* @param user usuario del mensaje.
* @param parameters parametros del mensaje.
*/
static public void error(String clase,String metodo,String mensaje,int prioridad,String user,Object parameters)
{
if (verbose)
{
//if (logger.isDebugEnabled())
//{
String MENSAJE = "["+clase+"] ["+metodo+"] : "+mensaje;
//logger.error(MENSAJE);
System.out.println(MENSAJE);
//}
}
}
//——————————————–
public static boolean isVerbose() {
return verbose;
}
public static void setVerbose(boolean verbose) {
DatabaseUtil.verbose = verbose;
}
public StringBuffer getSb() {
return sb;
}
}
//end of DatabaseUtil.java

Comentarios»

1. Actualizacion - Copiar datos entre tablas « Java.Lang.NullPointer - marzo 2, 2007

[…] copiar tablas entre bases de datos […]

2. david - marzo 30, 2007

bueno el codigo , podrias mandarme los Migracion.java y DatabaseUtil.java para sustituirlos por los mios es que hay cosas que no te entiendo. de antemano gracias

3. superpiwi - marzo 30, 2007

Hola David, no te entiendo?? Que quieres mandarme tu codigo para reemplazar el mio o que te mande el codigo yo??. Si quieres q te mande el codigo no hay problemas, pasame una direccion de correo y te los atacho. de todas formas si seleccionas el codigo y lo pegas con un editor de texto tambien lo tienes.

Este codigo es mejorable, estoy trabajando con una nueva version que permitira exportar el schema de una base de datos Oracle a otra, p.ej MySQL. pero aun tardare en tener algo…

Saludos,

4. fred - mayo 2, 2007

Hola superpiwi, podrias enviarme el codigo completo a seaf762004@yahoo.com.mx, ya que me fui por la opcion de copiar y pegar, pero al parecer en un ciclo “for” de DatabaseUtil.java esta “truncado”, por lo pronto, gracias. Este me ha servido para entender algunas cosas.

5. superpiwi - mayo 3, 2007

Hola Fred, he vuelto a pegar el codigo. De todas formas no es el original que tenia ya revisado asi que cuando vuelva a revisar estas clases actualizare este post. muchas gracias por avisarme, a veces pegas el codigo y se queda mal, temas de wordpress. Por cierto ten cuidado con las comillas simples y dobles, esas tienes que reemplazarlas porque a veces se quedan mal en el post.

6. pedro - julio 14, 2007

jaime

7. Cesar Castejon - marzo 21, 2009

Hola que tal man, si estamos ya en el 2009, pero esto que hiciste lo tengo como una tarea pero con varias cosas mas.. como seleccionar los campos que queremos que se copien, pasar de un archivo .csv a un origen y viceversa, y otras cositas.

Bueno no se si me podrias hechar una ayudita ya que es para el lunes 23 de marzo. de ante mano muchas gracias

8. kathemisae - julio 1, 2009

jajaja ya es 1 de julio y yo también voy a pillarme este código! gracias!


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: