Tengo una base de datos SQLite en un sistema, necesito extraer los datos almacenados en SQLite a la base de datos Oracle. ¿Cómo hago esto?SQLite a Oracle
Respuesta
Tendrá que convertir el SQLite en un archivo de texto (no está seguro del formato) y luego usar Oracle para cargar la base de datos desde el texto (la fuente es http://www.orafaq.com/wiki/SQLite). Puede usar el comando .dump
del shell interactivo SQLite para volcar en un archivo de texto (consulte the docs para obtener la sintaxis).
SQL Loader es una utilidad que leerá un archivo de texto delimitado y lo importará a una base de datos de Oracle. Necesitará mapear cómo cada columna de su archivo plano fuera de sqlite coincide con la correspondiente en la base de datos de Oracle. Aquí hay una buena FAQ que debería ayudarlo a comenzar.
Oracle proporciona el producto llamado Oracle Database Mobile Server (anteriormente llamado Oracle Database Lite) que le permite sincronizar entre un SQLite y una base de datos Oracle. Proporciona sincronización escalable bidireccional, asignación de esquema, seguridad, etc. El servidor móvil admite sincronización de datos tanto síncrona como asíncrona. Si esto es más que una exportación única y necesita mantener sus bases de datos SQLite y Oracle sincronizadas, ¡esta es una gran herramienta!
Descargo de responsabilidad: Soy uno de los Product Managers para Oracle Database Mobile Server, así que estoy un poco predispuesto. Sin embargo, el servidor móvil realmente es una gran herramienta para mantener sus bases de datos SQLite (o Berkeley DB) y Oracle sincronizadas.
Si es un desarrollador, podría desarrollar una aplicación para realizar la sincronización. Harías
SELECT name FROM sqlite_master WHERE type='table'
para obtener los nombres de tabla, entonces se podría volver a crearlos en Oracle (se puede hacer DROP TABLE tablename
en Oracle en primer lugar, para evitar un conflicto, en el supuesto de SQLite será autorizada) con CREATE TABLE
comandos . Conseguir las columnas para cada uno toma
SELECT sql FROM sqlite_master WHERE type='table' and name='MyTable'
Y luego hay que analizar el resultado:
string columnNames = sql.replace(/^[^\(]+\(([^\)]+)\)/g, '$1').replace(/ [^,]+/g, '').split(',');
string[] columnArray = columnNames.Split(',');
foreach (string s in columnArray)
{
// Add column to table using:
// ALTER TABLE MyTable ADD COLUMN s NVARCHAR(250)
}
Un StringBuilder
puede ser utilizado para recoger el nombre de la tabla con sus columnas para crear su comando INSERT
. Para agregar los valores, solo sería cuestión de hacer SELECT * FROM MyTable
para cada una de las tablas durante su ciclo a través de los nombres de tabla que obtuvo de la consulta inicial. Se podría iterar las columnas de las filas de la tabla de datos que fueron devueltos y añadir los valores a la StringBuilder
:
INSERT INTO MyTable (
+ Columna, ColumnB, etc. + ) VALUES (
DataRow [0], DataRow [1], etc. + )
.
No exactamente así, sin embargo, usted completa los datos al agregar el nombre de la columna y sus datos a medida que se ejecuta a través de los bucles. Puede obtener los nombres de las columnas al anexar s
en ese bucle foreach
, arriba. Cada valor de columna se establece mediante un bucle foreach
que le proporciona cada object obj in drData.ItemArray
. Si todo lo que tiene son campos de cadena, es fácil, simplemente agregue obj.ToString()
a su StringBuilder
para cada valor de columna en su consulta como he mostrado a continuación. A continuación, ejecuta la consulta después de recopilar todos los valores de columna para cada fila. Utiliza un nuevo StringBuilder
para cada fila; necesita restablecerse al INSERT INTO MyTable (
+ columnA, columnB, etc.+ ) VALUES (
antes de cada nueva fila, por lo que los nuevos valores de columna se pueden agregar.
Si tiene tipos de datos mixtos (es decir, DATE
, BLOB
, etc.), necesitará determinar los tipos de columnas a lo largo del camino, almacenarlos en una lista o matriz, luego usar un contador para determinar el índice de ese list/array slot y obtenga el tipo, para que sepa cómo traducir su objeto en algo que Oracle pueda usar, ya sea simplemente agregando to_date()
al resultado, con formato, para una fecha (ya que SQLite las almacena como cadenas de fechas con el formato yyyy-MM-dd HH:mm:ss
), o agregarlo a un OracleParameter
para un BLOB
y enviarlo a una función RunOracleCommand
. (I no entré en esto, a continuación.)
Poniendo todo esto junto produce esto:
string[] columnArray = null;
DataTable dtTableNames = GetSQLiteTable("SELECT name FROM sqlite_master WHERE type='table'");
if (dtTableNames != null && dtTableNames.Rows != null)
{
if (dtTableNames.Rows.Count > 0)
{
// We have tables
foreach (DataRow dr in dtTableNames.Rows)
{
// Do everything about this table here
StringBuilder sb = new StringBuilder();
sb.Append("INSERT INTO " + tableName + " ("); // we will collect column names here
string tableName = dr["NAME"] != null ? dr["NAME"].ToString() : String.Empty;
if (!String.IsNullOrEmpty(tableName))
{
RunOracleCommand("DROP TABLE " + tableName);
RunOracleCommand("CREATE TABLE " + tableName);
}
DataTable dtColumnNames = GetSQLiteTable("SELECT sql FROM sqlite_master WHERE type='table' AND name='"+tableName+"'");
if (dtColumnNames != null && dtColumnNames.Rows != null)
{
if (dtColumnNames.Rows.Count > 0)
{
// We have columns
foreach (DataRow drCol in dtTableNames.Rows)
{
string sql = drCol["SQL"] != null ? drCol["SQL"].ToString() : String.Empty;
if (!String.IsNullOrEmpty(sql))
{
string columnNames = sql.replace(/^[^\(]+\(([^\)]+)\)/g, '$1').replace(/ [^,]+/g, '').split(',');
columnArray = columnNames.Split(',');
foreach (string s in columnArray)
{
// Add column to table using:
RunOracleCommand("ALTER TABLE " + tableName + " ADD COLUMN " + s + " NVARCHAR(250)"); // can hard-code like this or use logic to determine the datatype/column width
sb.Append("'" + s + "',");
}
sb.TrimEnd(",");
sb.Append(") VALUES (");
}
}
}
}
// Get SQLite Table data for insertion to Oracle
DataTable dtTableData = GetSQLiteTable("SELECT * FROM " + tableName);
if (dtTableData != null && dtTableData.Rows != null)
{
if (dtTableData.Rows.Count > 0)
{
// We have data
foreach (DataRow drData in dtTableData.Rows)
{
StringBuilder sbRow = sb; // resets to baseline for each row
foreach (object obj in drData.ItemArray)
{
// This is simplistic and assumes you have string data for an NVARCHAR field
sbRow.Append("'" + obj.ToString() + "',");
}
sbRow.TrimEnd(",");
sbRow.Append(")");
RunOracleCommand(sbRow.ToString());
}
}
}
}
}
}
Todo esto supone que tiene una RunOracleCommand()
función void que puede tomar un comando SQL y ejecutarlo en contra un Oracle DB y una función GetSQLiteTable()
que puede devolver un DataTable de su base de datos SQLite pasándole un comando SQL.
Tenga en cuenta que este código no se ha probado, como lo escribí directamente en esta publicación, pero se basa en gran medida en el código que escribí para sincronizar Oracle en SQLite, que ha sido probado y funciona.
- 1. SQLite equivalente para Oracle ROWNUM?
- 2. Transfiera MySQL a SQLite
- 3. Conectando C# a Oracle
- 4. Migración EF a Oracle
- 5. cómo sincronizar sqlite a Mysql
- 6. relación muchos-a-muchos SQLite?
- 7. SQLite unirse a la optimización
- 8. Oracle: ¿Cómo convierto hexadecimal a decimal en Oracle SQL?
- 9. Opuesto a INTERSECT en Oracle
- 10. Conectando a Oracle usando PHP
- 11. alternativa a listagg en Oracle?
- 12. Migrar de Oracle a MySQL
- 13. Conectando a Oracle desde F #
- 14. Excepción SQLite: SQLite ocupado
- 15. android sqlite sincronización bidireccional sqlite
- 16. Replicación punto a punto de una base de datos sqlite
- 17. Datos principales frente a Sqlite y rendimiento
- 18. Datos principales frente a SQLite 3
- 19. ¿Alguna consideración antes de saltar a SQLite?
- 20. SQLite de formato largo a ancho?
- 21. Exportación de SQLite a SQL Server
- 22. ¿Cómo puedo acceder a SQLite con C#?
- 23. ¿Cómo puedo insertar a granel con SQLite?
- 24. ¿Cómo accedo a SQLite desde VBA?
- 25. Sqlite: agregar comentarios a tablas y columnas?
- 26. Cadena de conversión Sqlite a la fecha
- 27. Zend Framework: Comenzando a usar SQLite
- 28. SQL Server Compact 4.0 frente a SQLite
- 29. Android: SQLite de diseño uno a muchos
- 30. Alternativa similar a SQLite para MongoDB?