Oracle: Varchar2 Felder als Integer ansprechbar

5 10 2007

Was erwartet man normalerweise von einem varchar Feld? Dass es Character-Werte speichert. Das normale Verhalten demnach wie im Beispiel unter DB2. Ich kann zwar Zahlen in ein varchar Feld speichern, diese lassen sich aber nur als Character abfragen.

db2 => CREATE TABLE formate (feld varchar(100))
DB20000I  The SQL command completed successfully.

db2 => INSERT INTO formate VALUES ('1')
DB20000I  The SQL command completed successfully.

db2 => INSERT INTO formate VALUES ('2')
DB20000I  The SQL command completed successfully.

db2 => SELECT * FROM formate
FELD
-------------------------------------------------------------------
1
2

-- Abfrage als Integer resultiert in einem Fehler
db2 => SELECT * FROM formate WHERE feld = 1
SQL0401N  The DATA types of the operands FOR the operation "=" are NOT compatible.  SQLSTATE=42818

-- Abfrage als Character funktioniert
db2 => SELECT * FROM formate WHERE feld = '1'
FELD
-------------------------------------------------------------------
1

Anders aber unter Oracle mit varchar2 Feldern. Diese gelten scheinbar so lange nur Zahlen eingefügt werden tatsächlich als Integer-Felder. Ich kann also Werte aus varchar2 Feldern im Integer Format abfragen. Dies allerdings nur so lange, bis der erste Character eingefügt wird. Wozu dieses Verhalten gut sein mag, ob das wirklich so gewollt ist, eine wirkliche Erklärung konnte ich dafür nicht finden.

SQL> CREATE TABLE formate (feld varchar2(100));
TABLE created.

SQL> INSERT INTO formate VALUES ('1');
1 row created.

SQL> INSERT INTO formate VALUES ('2');
1 row created.

SQL> SELECT * FROM formate;
FELD
----------------------------------------------------–
1
2

-- Abfrage als Integer funktioniert
SQL> SELECT * FROM formate WHERE feld=1;
FELD
----------------------------------------------------–
1

SQL> INSERT INTO formate VALUES ('a');
1 row created.

SQL> SELECT * FROM formate;
FELD
----------------------------------------------------–
1
2
a

-- Abfrage als Integer funktioniert nicht mehr, weil ein Character-Datensatz eingefügt wurde
SQL> SELECT * FROM formate WHERE feld=1;
ERROR:
ORA-01722: invalid number
no rows selected

SQL> DELETE FROM formate WHERE feld='a';
1 row deleted.

-- Abfrage als Integer funktioniert wieder, weil der Character-Datensatz gelöscht wurde
SQL> SELECT * FROM formate WHERE feld=1;
FELD
----------------------------------------------------–
1