1. Start
  2. Unternehmen
  3. Blog
  4. 23c New Feature: Boolean Datentyp

23c New Feature: Boolean Datentyp

Der Datentyp Boolean ist praktisch die Grundlage der IT, einfache Wahrheitswerte, die Boolesche Logik,  bilden die Grundlage aller gängiger IT-Systeme. Umso verwunderlicher war es, das die Oracle Datenbank, im Gegensatz zu vielen anderen Datenbanksystemen, diesen Datentyp nur im PL/SQL kennt, nicht aber für Tabellendefinitionen zulässt. Mit dem Release 23c ändert sich das nun. Man kann Tabellen mit Spalten des Typs Boolean anlegen.  

 

[oracle@db23ctest ~]$ sql test/xxxxxxxx@db23ctest.snrsbctl.vcnrsbctl.oraclevcn.com:1521/db23c_pdb1.snrsbctl.vcnrsbctl.oraclevcn.com


SQLcl: Release 23.2 Production on Thu Mar 14 14:20:35 2024

Copyright (c) 1982, 2024, Oracle.  All rights reserved.


Connected to:
Oracle Database 23c EE High Perf Release 23.0.0.0.0 - Production
Version 23.3.0.23.09

TEST @ DB23C:DB23C_PDB1:>create table booltest (name varchar2(100), is_active boolean);

Table BOOLTEST created.

TEST @ DB23C:DB23C_PDB1:>desc booltest

Name         Null?    Type
____________ ________ ________________
NAME                  VARCHAR2(100)
IS_ACTIVE             BOOLEAN

 

So weit, so gut. Spannend ist die Implementierung. Denn man kann alle möglichen Werte verwenden, die Datenbank versucht, es irgendwie in Boolean darzustellen. Hier ein paar Beispiele:

 

TEST @ DB23C:DB23C_PDB1:>insert into booltest values ('King', true);

1 row inserted.

TEST @ DB23C:DB23C_PDB1:>insert into booltest values ('Queen', false);

1 row inserted.

TEST @ DB23C:DB23C_PDB1:>insert into booltest values ('Salesman', 'YES');

1 row inserted.

TEST @ DB23C:DB23C_PDB1:>insert into booltest values ('Fisherman', 'No');

1 row inserted.

TEST @ DB23C:DB23C_PDB1:>insert into booltest values ('Controller', 1);

1 row inserted.

TEST @ DB23C:DB23C_PDB1:>insert into booltest values ('Developer', 0);

1 row inserted.

TEST @ DB23C:DB23C_PDB1:>insert into booltest values ('Administrator', 'Y');

1 row inserted.

TEST @ DB23C:DB23C_PDB1:>insert into booltest values ('Chef', 'N');

1 row inserted.

TEST @ DB23C:DB23C_PDB1:>commit;

Commit complete.

 

Nur mit anderen Sprachen scheint sich die Datenbank etwas schwer zu tun:

 

TEST @ DB23C:DB23C_PDB1:>insert into booltest values ('Administrator', 'Ja');

Error starting at line : 1 in command -
insert into booltest values ('Administrator', 'Ja')
Error at Command Line : 1 Column : 47
Error report -
SQL Error: ORA-61800: invalid boolean literal: Ja
Help: docs.oracle.com/error-help/db/ora-61800/

 

Das Ergebnis sieht dann so aus, zumindest wenn man das SQL*Plus verwendet:

 

TEST @ DB23C:DB23C_PDB1:>select * from booltest;

NAME                                                       IS_ACTIVE
---------------------------------------------------------- -----------
King                                                       TRUE
Queen                                                      FALSE
Salesman                                                   TRUE
Fisherman                                                  FALSE
Controller                                                 TRUE
Developer                                                  FALSE
Administrator                                              TRUE
Chef                                                       FALSE

 

Allerdings mag das SQLcl Version 23.2, dass standardmäßig mit der Datenbank ausgeliefert wird, den neuen Datentyp scheinbar noch nicht so.

 

[oracle@db23ctest ~]$ sql test/xxxxxxxx@db23ctest.snrsbctl.vcnrsbctl.oraclevcn.com:1521/db23c_pdb1.snrsbctl.vcnrsbctl.oraclevcn.com

SQLcl: Release 23.2 Production on Fri Mar 15 06:12:40 2024

Copyright (c) 1982, 2024, Oracle.  All rights reserved.


Last Successful login time: Fri Mar 15 2024 06:12:41 +00:00

Connected to:
Oracle Database 23c EE High Perf Release 23.0.0.0.0 - Production
Version 23.3.0.23.09


TEST @ DB23C:DB23C_PDB1:>select * from booltest;


0 rows selected.

 

Ist es aber nun erforderlich, einen aktuellen Client zu verwenden, der den neuen Datentyp auch versteht? Wie verhält sich beispielsweise ein älteres SQL*Plus?

 

C:\Users\marco.mischke>sqlplus test/xxxxxxxx@10.0.30.110:1521/db23c_pdb1.snrsbctl.vcnrsbctl.oraclevcn.com

SQL*Plus: Release 19.0.0.0.0 - Production on Fri Mar 15 07:05:50 2024
Version 19.15.0.0.0

Copyright (c) 1982, 2021, Oracle.  All rights reserved.

Last Successful login time: Thu Mar 14 2024 15:27:30 +01:00

Connected to:
Oracle Database 23c EE High Perf Release 23.0.0.0.0 - Production
Version 23.3.0.23.09

TEST @ DB23C:DB23C_PDB1:>select * from booltest;

NAME                  IS_ACTIVE
-------------------- ----------
King                          1
Queen                         0
Salesman                      1
Fisherman                     0
Controller                    1
Developer                     0
Administrator                 1
Chef                          0

8 rows selected.

 

Man sieht hier, dass der Boolean Datentyp intern offenbar als Zahl mit "0" für "False" oder "1" für "True" abgebildet wird. Das entspricht der gängigen Interpretation und sollte damit transparent für alle Anwendungen funktionieren. Im Einzelfall sollte man es natürlich zuerst einmal testen.

Auch ein älteres SQLcl erzeugt diese Darstellung der Daten:

 

C:\Users\marco.mischke>sql test/xxxxxxxx@10.0.30.110:1521/db23c_pdb1.snrsbctl.vcnrsbctl.oraclevcn.com


SQLcl: Release 22.4 Production auf Fr. März 15 07:07:07 2024

Copyright (c) 1982, 2024, Oracle. All rights reserved. Alle Rechte vorbehalten.

Verbunden mit:
Oracle Database 23c EE High Perf Release 23.0.0.0.0 - Production
Version 23.3.0.23.09

TEST @ DB23C:DB23C_PDB1:>select * from booltest;

NAME                IS_ACTIVE
________________ ____________
King                        1
Queen                       0
Salesman                    1
Fisherman                   0
Controller                  1
Developer                   0
Administrator               1
Chef                        0

8 Zeilen ausgewählt.

 

 In SUmme also ein kleines, aber feines neues Feature, dass die Datenbank da mitbringt. Vor allem für die Verständlichkeit des Datenmodells ist das ein großer Fortschritt, wenn Wahrheitswerte nun nicht mehr umständlich als Zahl oder VARCHAR(1) gespeichert werden müssen.

Kommentare

Keine Kommentare

Kommentar schreiben

* Diese Felder sind erforderlich