Jeden INSERT do różnych baz danych

0

Zadanie jest takie, że trzeba wstawić ok. 20-50 tys. rekordów do tabel o identycznej strukturze znajdujących się w różnych SZBD (MSSQL, MySQL, Oracle, PostgreSQL) za pomocą wygenerowanego programowo skryptu. I teraz pytanie, czy między tymi SZBD występują różnice w składni INSERT, czy da się wygenerować uniwersalny skrypt dla wszystkich baz?
Z uwagi na liczbę rekordów warto byłoby chyba ze względów czasowych zrobić to w sposób bardziej przemyślany niż ciąg insertów, z których każdy będzie oddzielną transakcją. I tu kolejne pytanie, jak to najbardziej uniwersalnie zrealizować? Bo chyba nie da rady 50 tys. rekordów wrzucić do jednego multirow insert, żeby śmigało wszędzie?

1
  1. jeśli masz pole z data/czasem to tu może być problem (np. w oracle najbezpieczniej jest w insercie dać to_date(..))
  2. różne bazy traktują różne nazwy jako "systemowe" i takie nazwy kolumn/pól trzeba wziąć w specjalne znaki - np. "" albo [] - zwróć uwagę czy np. nie masz nazw pól typu date type itp
  3. nie wiem czy wszystkie bazy stringa przyjmują w pojedynczych apostrofach
  4. różne bazy mają różnie zrealizowany multi insert - np. oracle ma to zrealizowane całkiem inaczej niż większość :p
  5. co do samego wstawiania to wstawiaj to w paczkach po 500 - 1000 rekordów i po każdej transakcji commit. Z jednej strony będziesz miał mniej commitów a z drugiej jeden duży też nie jest dobry bo baza sobie musi przecież zapisywać stan dla ew. rollback
0

Zadanie niezbyt dobrze sprecyzowane, a tym bardziej temat postu nie jest adekwatny do treści.
W jakim standardzie SQL skrypt powinien zostać napisany lub czy można wykorzystywać posiadane narzędzia programistyczne?

0

Faktycznie nieprecyzyjnie się wyraziłem.
Po prostu chcę wygenerować skrypt zawierający polecenia SQL wstawiające 50 tys. rekordów do bazy i chciałbym, żeby ten sam skrypt mógł być wykorzystany przez różne SZBD. Ale z tego, co napisał Misiekd wynika, że nie da rady tego osiągnąć.

0

to może inaczej.. generuj skrypt w zależności od rodzaju bazy danych wykorzystując parametry, a dane do wstawienia przechowuj w jakim chcesz formacie :)

0

Wejdź na stronę http://www.embarcadero.com.pl/tech/webinars/ wyświetl sobie opis FireDac i zobaczysz że jest to możliwe.

dłuższy

0

Obawiam się, że jednym skryptem wydajnie nie da się tego zrobić. Np. w PostgreSQL robienie tego INSERTami nawet z committem co 1000 rowków i tak będzie dużo mniej wydajne niż jedno wywołanie COPY z pliku csv. Inna rzecz, że 50 tys. rowków to jest tyle co nic. Nawet z committem co rowek to nie powinno trwać dłużej niż pół sekundy, no chyba że w tyych rowkach jakieś duże bloby trzymasz. Co Ty masz w tych rowkach, że się przejmujesz wydajnością?

0

@dluzszy, dzięki za info, co prawda na stronę dla programistów Delphi nie wejdę, ale może komuś się przyda. Tylko następnym razem patrz proszę na daty postów.

@Krolik, ja po trzech latach nawet nie pamiętam, po co zadałem to pytanie. :) Zdaje się że w tamtych czasach pisałem jakiś programik do migracji danych między różnymi bazami. Teraz pewno użyłbym NHibernate z providerami do różnych baz i nie przejmował się wydajnością, albo poszukał jakichś bulk insertów - skoro jest w MSSQL, to w innych SZBD pewno też.

1 użytkowników online, w tym zalogowanych: 0, gości: 1