Mam bazy danych SQLite w jednym systemie, muszę wyodrębnić dane przechowywane w SQLite do bazy danych Oracle. Jak mam to zrobic?SQLite do Oracle
Odpowiedz
Będziesz musiał przekonwertować SQLite na plik tekstowy (nie pewny formatu), a następnie użyć Oracle do załadowania bazy danych z tekstu (źródło: http://www.orafaq.com/wiki/SQLite). Możesz użyć polecenia .dump
z interaktywnej powłoki SQLite do zrzutu do pliku tekstowego (zobacz składnię w podpunkcie the docs).
SQL Loader to narzędzie, które odczyta rozgraniczony plik tekstowy i zaimportuje go do bazy danych Oracle. Będziesz musiał zmapować sposób, w jaki każda kolumna z pliku płaskiego z sqlite pasuje do odpowiadającej jej w bazie danych Oracle. Oto dobry FAQ, który powinien pomóc Ci zacząć.
Firma Oracle oferuje produkt o nazwie Oracle Database Mobile Server (wcześniej o nazwie Oracle Database Lite), który umożliwia synchronizację między bazą danych SQLite i bazą danych Oracle. Zapewnia skalowalną dwukierunkową synchronizację, mapowanie schematów, bezpieczeństwo itd. Serwer mobilny obsługuje synchroniczną i asynchroniczną synchronizację danych. Jeśli jest to więcej niż jednorazowy eksport i musisz zachować synchronizację danych SQLite i Oracle, jest to świetne narzędzie!
Nota prawna: Jestem jednym z Product Managers dla Oracle Database Mobile Server, więc jestem nieco stronniczy. Jednakże, Mobile Server jest naprawdę świetnym narzędziem do utrzymywania synchronizacji SQLite (lub Berkeley DB) i baz danych Oracle.
Jeśli jesteś programistą, możesz utworzyć aplikację do przeprowadzenia synchronizacji. byś zrobił
SELECT name FROM sqlite_master WHERE type='table'
uzyskać nazwy tabel, a następnie można odtworzyć je w Oracle (można zrobić DROP TABLE tablename
w Oracle po pierwsze, aby uniknąć konfliktu, zakładając SQLite będzie autorytatywny) z CREATE TABLE
poleceń . Pierwsze kolumny dla każdego z nich trwa
SELECT sql FROM sqlite_master WHERE type='table' and name='MyTable'
A potem trzeba analizować wynik:
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)
}
StringBuilder
mogą być wykorzystywane do zbierania nazwę tabeli z kolumnami, aby utworzyć polecenie INSERT
. Aby dodać wartości, byłoby po prostu kwestią zrobienia SELECT * FROM MyTable
dla każdej z tabel podczas pętli poprzez nazwy tabel, które otrzymałeś z pierwotnego zapytania. byś iteracyjne kolumn wierszy DataTable pan wrócił i dodać wartości do StringBuilder
:
INSERT INTO MyTable (
+ Columna, columnB itp + ) VALUES (
DataRow [0], DataRow [1], itd. + )
.
Nie do końca tak - wpisujesz dane, dołączając nazwę kolumny i jej dane w trakcie wykonywania pętli. Możesz uzyskać nazwy kolumn przez dodanie s
w tej pętli foreach
powyżej. Każda wartość kolumny jest następnie ustawiana za pomocą pętli foreach
, która daje każdemu object obj in drData.ItemArray
. Jeśli wszystko, co masz, to pola tekstowe, to proste, wystarczy dodać obj.ToString()
do swojej wartości StringBuilder
dla każdej wartości kolumny w zapytaniu, tak jak poniżej. Następnie uruchamiasz zapytanie po zebraniu wszystkich wartości kolumn dla każdego wiersza. Używasz nowego StringBuilder
dla każdego wiersza - musi on zostać zresetowany do INSERT INTO MyTable (
+ kolumna A, kolumna B itp.+ ) VALUES (
przed każdym nowym wierszem, aby można było dodać nowe wartości kolumn.
Jeśli mieszane typy danych (tj DATE
, BLOB
, itd.), Trzeba określić typy kolumn po drodze, należy go przechowywać w wykazie lub tablicy, a następnie użyć licznika, aby określić, że indeks list/array slot i pobierz typ, dzięki czemu wiesz jak przetłumaczyć twój obiekt na coś, czego Oracle może użyć - czy to oznacza po prostu dodanie to_date()
do wyniku, z formatowaniem, dla daty (ponieważ SQLite przechowuje je jako ciągi daty w formacie yyyy-MM-dd HH:mm:ss
) lub dodanie go do OracleParameter
dla i wysłanie go do funkcji RunOracleCommand
. (I nie idź do tego poniżej).
Umieszczenie wszystko to razem daje to:
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());
}
}
}
}
}
}
Wszystko to zakłada masz RunOracleCommand()
utratę funkcji, które można wziąć polecenia SQL i uruchomić go przed funkcja Oracle DB i funkcja GetSQLiteTable()
, która może zwrócić tabelę DataTable z bazy danych SQLite poprzez przekazanie jej polecenia SQL.
Należy zauważyć, że ten kod nie został przetestowany, ponieważ napisałem go bezpośrednio w tym poście, ale jest on oparty na kodzie, który napisałem, aby zsynchronizować Oracle z SQLite, który został przetestowany i działa.
- 1. Ładowanie danych masowych do sqlite?
- 2. MySQL do SQLite konwerter
- 3. Python CSV do SQLite
- 4. Przeniesienie MySQL do SQLite
- 5. Konwersja SQLite do JSON
- 6. oracle varchar do numeru
- 7. SQLite/PHP tylko do odczytu?
- 8. SQLite wiele do wielu relacji?
- 9. jak zsynchronizować sqlite do Mysql
- 10. Jak wczytać rozszerzenia do SQLite?
- 11. Wstawianie daty systemowej do oracle
- 12. oracle do mysql lewej dołącza
- 13. Oracle WYKONAJ NATYCHMIAST do kursora
- 14. ropucha do rozwijania autouzupełniania oracle
- 15. Łącze do bazy danych Oracle
- 16. Jak można zobaczyć strukturę tabeli w SQLite?
- 17. Oracle developer VM with Oracle 11g
- 18. Oracle SQL vs Oracle PL/SQL
- 19. Używanie Reszta do przechowywania danych w Sqlite
- 20. DOŁĄCZ DO PEŁNEGO ZEWNĘTRZNEGO z SQLite
- 21. Jak podłączyć CakePHP do bazy danych SQLite?
- 22. Alternatywa podobna do SQLite dla MongoDB?
- 23. add sqlite DB do pliku wykonywalnego JAR
- 24. SQLite kwerendy do znalezienia kluczy podstawowych
- 25. Ucieczka apostrof znaków podczas importowania do SQLite
- 26. sqlite wstaw nową wartość do widoku
- 27. Jak wstawić datetime z timezone do SQLite?
- 28. sqlite insert do tabeli select * from
- 29. Importowanie plików z rozszerzeniem .sqlite do R
- 30. Wkładanie NSData do SQLite na iPhone