Seite 1 von 1

Problem mit boolean

Verfasst: Do 24. Sep 2009, 16:16
von postgre_neuling
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. [size=84]
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
[/size]

Verfasst: Do 24. Sep 2009, 17:18
von akretschmer
postgre_neuling hat geschrieben: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. [size=84]
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
[/size]


Die saubere Lösung wäre, den Code aufzuräumen. Aber vielleicht geht auch ein CAST:

Code: Alles auswählen

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)




Hmm, ich gebe zu, das ist mein erster CAST überhaupt, den ich gemacht habe. Vielleicht hilft es Dir als Anregung.

Andreas

Verfasst: Do 24. Sep 2009, 17:22
von ads
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

Verfasst: Do 24. Sep 2009, 17:29
von akretschmer
akretschmer hat geschrieben:Die saubere Lösung wäre, den Code aufzuräumen. Aber vielleicht geht auch ein CAST:

[


Ja, ich Dussel dachte nach dem abschicken auch schon an ads ;-)

Andreas