Hallo,
ich habe derzeit folgendes Problem, würde mich freuen wenn jemand von euch helfen könnte.
in unserer Firma wollen wir unser Softwareprojekt derzeit von MS SQL auf Postgres umstellen.
Beim Zugriff via JDBC fiel uns auf, dass smallint Spalten nicht via get/setBoolean() angesprochen werden können. Hier meldet sich Postgre (mit Recht) zu Wort, dass die Spalten nicht von boolean in smallint gecastet werden können. ALso haben wir diese Spalten angepasst und den Datentyp sämtlicher betroffener Spalten auf boolean umgestellt. Leider haben wir jetzt das Problem beim umgekehrten weg: Das Speichern von boolean Werten schreibt in die Spalten z.b. die Werte "f" für false oder "t" für true. Was nun insofern ein problem ist, als das an sehr vielen Stellen in unserer Software per getInt() auf diese Spalten zugegriffen wird (ich weis, das ist ein Designfehler aber leider nunmal nicht mehr zu ändern). Wir bekommen dann eine Exception mit dem Fehlertext.
Unzulässiger Wert für den Typ int : f.
Meine Frage wäre dazu: Gibt es eine Möglichkeit, Postgre so zu konfigurieren, dass anstelle der Werte f und t einfach - wie bei anderen Datenbanken - 0 und 1 in die Spalten geschrieben wird? Das wäre für unser Vorhaben äußerst hilfreich, da sämtliche Anpassungen im Code sehr aufwändig und fehleranfällig wären.
Gruß,
postgre_neuling
Die saubere Lösung wäre, den Code aufzuräumen. Aber vielleicht geht auch ein CAST:
Hmm, ich gebe zu, das ist mein erster CAST überhaupt, den ich gemacht habe. Vielleicht hilft es Dir als Anregung.Code:test=# create function text2int(text) returns int as $$begin if $1='t' then return 1; else return 0; end if; end;$$ language plpgsql; CREATE FUNCTION Zeit: 0,350 ms test=*# create cast (text as int) with function text2int(text) as IMPLICIT; CREATE CAST Zeit: 0,270 ms test=*# select 't'::text::int; int4 ------ 1 (1 Zeile) Zeit: 8,581 ms test=*# insert into foo (i) values ('t'::text::int); INSERT 0 1 Zeit: 0,323 ms test=*# test=*# \d foo Tabelle »public.foo« Spalte | Typ | Attribute --------+---------+----------- i | integer | test=*# select * from foo; i --- 1 (1 Zeile)
Andreas
--
PostgreSQL Hosting
http://www.amazon.de/gp/registry/2APKFICAIYMWBads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
https://www.xing.com/profile/Andreas_Kretschmer7
Also zuerst einmal: das heißt "PostgreSQL" oder kurz "Postgres". Das "Postgre" ist keine Abkürzung sondern schlicht falsch ;-)
Und zu deinem Problem: ich habe da schon mal was geschrieben zu:
BOOLEAN datatype with PHP-compatible output - ads' corner
Als Belohnung (für mich) darfst du jetzt das Buch aus meiner Signatur bestellen, dort wird das nämlich alles schön erklärt ;-)
/me geht jetzt wieder an den Strand und genießt Sonne
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
--
PostgreSQL Hosting
http://www.amazon.de/gp/registry/2APKFICAIYMWBads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
https://www.xing.com/profile/Andreas_Kretschmer7
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen