ejemplo create java sql oracle

java - create - Generar ansi sql INSERT INTO



create table access ejemplo (7)

Tengo base de datos Oracle con 10 tablas. Algunas de las tablas tienen texto de datos CLOB. Necesito exportar datos de estas tablas de forma programática utilizando Java. Los datos de exportación deben estar en formato ANSI INSERT INTO SQL, por ejemplo:

INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);

La idea principal es que necesito importar estos datos en tres bases de datos diferentes: ORACLE , MSSQL y MySQL . Como sé, todas estas bases de datos admiten ANSI INSERT INTO. Pero no he encontrado ninguna API / framework java para generar scripts SQL de datos. Y no sé cómo tratar con los datos de CLOB, cómo exportarlos.
¿Cuál es la mejor manera de exportar datos desde una base de datos con java?

ACTUALIZACIÓN: (01.07.2018)
Supongo que es imposible insertar datos de texto de más de 4000 bytes de acuerdo con esta respuesta . ¿Cómo generar scripts PL / SQL usando java programáticamente? ¿O hay algún otro formato de exportación que admita ORACLE, MSSQL, etc.?


Necesito exportar datos de estas tablas mediante programación utilizando Java.

¡Vamos, muchacho! ¿Cual es el asunto? Java es una herramienta para operar datos, no para migrar. Si se trata de ETL, utilice los entornos ETL del DBMS de destino o escriba un código ETL por su cuenta.


¿Alguna vez pensaste en un ORM-Api adecuado? Lo primero en mi mente vendría a Hibernate o JPA / JPQL más abstracto. El marco conoce todos los dialectos sql principales. Todo lo que necesita es definir sus conexiones con sus dialectos. Luego de recuperar los datos de la base de datos y su asignación en los POJO''s, y de empujar (insertar) los datos a su conexión diferente (otro dialecto). Debería funcionar bien, creo, incluso si nunca hice esto. Pero sé que JPA no es nuevo y se usa ampliamente para cambiar la base de datos, incluso cuando el software ya está en producción. Este enfoque es un poco inoperante, ya que cada fila se transforma en POJO y, afaik, no hay inserción masiva disponible.


Me gusta mucho "pro-gramaticalmente". :)

La mejor manera de exportar esos datos es iterar sobre las tablas, luego consultar cada una de ellas y generar texto sin formato con insert into declaraciones. Puede ser un problema si tiene datos binarios allí, ya que diferentes RDBS pueden tratarlos de una manera ligeramente diferente.

Leer blob / clob en el lado de Java significa leer la secuencia. Puede ser binario, o flujo de caracteres. Para Oracle, desde el documento , puedes hacer:

ResultSet rs = s.executeQuery( "SELECT text FROM documents WHERE id = 1477"); while (rs.next()) { java.sql.Clob aclob = rs.getClob(1); java.io.InputStream ip = rs.getAsciiStream(1); int c = ip.read(); while (c > 0) { System.out.print((char)c); c = ip.read(); } System.out.print("/n"); }

A partir de this respuesta, puedes hacerla más corta:

Clob clob = resultSet.getClob("CLOB_COLUMN") String clob_content = clob.getSubString(1, (int) clob.length());

Escribir la salida quizás requiera tratar con: /t/n/r . Depende de tus necesidades, contenido. Los documentos tienen un ejemplo completo: lectura, escritura. Utilizan declaraciones preparadas, y es por eso que se necesitan flujos en ambos extremos. Si su clob no es grande, como 32k / 64k, puede haber otros límites. Si tiene algún ejemplo, como create table con 2-3 filas, sería mucho más fácil para cualquiera escribir código y proporcionar algo que funcione ...


Para MSSQL y ORACLE puede usar la sintaxis de la herramienta MERGE (y la cláusula USING para datos) para los estándares ANSI:

MERGE INTO tablename USING table_reference ON (condition) WHEN MATCHED THEN UPDATE SET column1 = value1 [, column2 = value2 ...] WHEN NOT MATCHED THEN INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...]);

Para MySQL hay una sintaxis diferente (On Duplicate Key Update Statement) :

-- Insert new or merge into existing row. MERGE INTO system_user target USING (SELECT 1 AS system_user_id , ''SYSADMIN'' AS system_user_name , 1 AS system_user_group_id , 1 AS system_user_type , ''Samuel'' AS first_name , ''the'' AS middle_name , ''Lamanite'' AS last_name , 1 AS created_by , SYSDATE AS creation_date , 1 AS last_updated_by , SYSDATE AS last_update_date FROM dual) SOURCE ON (target.system_user_id = SOURCE.system_user_id) WHEN MATCHED THEN UPDATE SET first_name = ''Samuel'' , middle_name = ''the'' , last_name = ''Lamanite'' , last_updated_by = 1 , last_update_date = SYSDATE WHEN NOT MATCHED THEN INSERT ( target.system_user_id , target.system_user_name , target.system_user_group_id , target.system_user_type , target.first_name , target.middle_name , target.last_name , target.created_by , target.creation_date , target.last_updated_by , target.last_update_date ) VALUES ( SOURCE.system_user_id , SOURCE.system_user_name , SOURCE.system_user_group_id , SOURCE.system_user_type , SOURCE.first_name , SOURCE.middle_name , SOURCE.last_name , SOURCE.created_by , SOURCE.creation_date , SOURCE.last_updated_by , SOURCE.last_update_date );

Y:

-- Insert new or merge into existing row. INSERT INTO system_user ( system_user_name , system_user_group_id , system_user_type , first_name , middle_name , last_name , created_by , creation_date , last_updated_by , last_update_date ) VALUES (''SYSADMIN'' , 1 , 1 ,''Samuel'' ,''the'' ,''Lamanite'' , 1 , NOW() , 1 , NOW()) ON DUPLICATE KEY UPDATE first_name = ''Samuel'' , middle_name = ''the'' , last_name = ''Lamanite'' , last_updated_by = 1 , last_update_date = UTC_DATE();



Si su necesidad es exportar tablas desde una base de datos Oracle para insertarla nuevamente en diferentes tipos de Base de datos, sugeriría un enfoque diferente.

Este es el caso de uso perfecto para JPA (Java Persistence API) que le permite crear un modelo que represente la estructura de su base de datos. Esta es la solución de solución actual de Java para administrar diferentes tipos de bases de datos.

Desde su modelo podrá generar solicitudes compatibles con todas las bases de datos populares.

Así que mi sugerencia es usar Spring Boot + Spring Data + Spring Batch:

  1. Cree una primera aplicación de su modelo que exporte el contenido de sus tablas al formato CSV.
  2. Crea una segunda aplicación del mismo modelo que importa tus archivos CSV. Dependiendo de su jdbc url, Spring Boot activará automáticamente el dialecto apropiado para su base de datos de destino y generará las consultas correctas (este también es el caso para la exportación).

Esto se puede hacer dentro de un tiempo razonable y con un rendimiento decente.


Yo probaría Scriptella . Es una herramienta de ejecución de secuencia de comandos y ETL de código abierto escrita en Java, en la cual usted define en un archivo xml las conexiones y transformaciones de origen y destino, si es necesario. Las conexiones pueden ser JDBC o incluso a archivos de texto y hay características para el soporte por lotes. El archivo xml resultante se puede procesar mediante programación con java, ant o línea de comando.

En su tutorial de dos minutos hay ejemplos para copiar tablas a otra base de datos y trabajar con BLOBs.