Hallo,
ich habe da ein mehr oder weniger großer Problem. Ich muss Daten von Oracle 8i testweise auf PostgreSQL 8.4 portieren. Unter Oracle 8i gab es noch keinen timestamp, so dass man sich mit varchar(16) ausgeholfen hat.
Doch wenn schon, dann sollen diese Strings bei der Portierung in einen timestamp umgewandelt werden. Geht ja prinzipiell über die Funktion to_timestamp. Doch handelt es sich hierbei im mehrere Milliarden Datensätze, so dass ein Insert Trigger, welche die Umwandlung übernimmt einiges an Performace kosten wird.
Ich dachte, dass man bei, Create Table statement irgendwie das einzufügende Format für date angeben kann, doch finde ich nichts in der Doku und auch Google verrät nichts in der Hinsicht.
Muss ich das wirklich über einen Trigger machen, oder habt ihr eine andere Idee?
Ich danke schon mal im Voraus ganz herzlich.
mfg
Marcus
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Das Input-Format ist PostgreSQL reichlich egal. Alles, was halbwegs nach einem (gültigen) Timestamp ausschaut, wird akzeptiert.
Näheres findest du in der Dokumentation:
PostgreSQL: Documentation: Manuals: PostgreSQL 8.4: Date/Time Types
Intern werden die unterschiedlichen Formate dann alle in ein einheitliches umgewandelt.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören
Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler
PostgreSQL Service & Support
Per Insert sollten die Daten rein. Nutze dafür das perlskript vom ora2pg Paket.
Das Format des Quellsystems ist: '200312012305123215' und da würde ich gerne irgendwie bei der Spaltendefinition angeben, was was ist. So geht es jedenfalls nicht. Über to_timestamp funktioniert die Formatanpassung.
mfg
Marcus
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
'200312012305123215' nach 2003-12-01 23:05:12.3215 nach Postgres
Du meinst to_timestamp in einem Insert Trigger?
mfg
Marcus
Wird wohl mit einem Trigger gar nicht gehen, weil der schon vorher über den kapotten Typ meckert. Kannst Du nicht vorher schon den Dump, den Du da reinziehen willst, bearbeiten? Dies dürfte am schnellsten sein. Ansonsten vielleicht über eine Zwischentabelle und aus der via insert into ... select ... arbeiten.
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
oder in die PG-table in die er importiert einfach eine column einfuegen, die da z.Bleistiftheisst.Code:karpottes_timestamp varchar(20), ...
in dem BEFORE INSERT trigger (row-level) kann er dann in aller ruhe seinen
berechnenCode:NEW.schoener_timestamp = to_timestamp(NEW.karpottes_timestamp);
und hernach ggf. die spalte karpottes_timestamp einfach wieder droppen
natuerlich muss er im INSERT statement den karpotten timestamp (text) auch in karpottes_timestamp fuellen - und den schoenen timestamp leer lassen - oder falls not null einfach mit DEFAULT initialisieren .. der trigger wirds schon richten ..
oder bei (BULK) COPY auch das richtige falsche feld befuellen ..
jenachdem was er da gerade verwenden tut
Geändert von symbiont (29.09.2009 um 17:21 Uhr)
Man könnte natürlich die Tabelle zuerst mal mit VARCHAR erstellen und dann den Datentyp nachträglich ändern. Beim Konvertieren kann man dann eine Funktion angeben, die die Arbeit erledigt.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören
Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler
PostgreSQL Service & Support
oder so .. das ist aber nicht so aufregend![]()
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen