Gestern und heute hat mich ein Bug beschäftigt, der gerade mal wieder sehr schön illustriert, was ich an Oracle als DBMS hasse. Die Fehlermeldung, welche ein Test plötzlich ausspuckte, sah so aus:
oci_execute(): ORA-00906: missing left parenthesis
Wie immer: Keine Details, wo genau er aufgetreten ist, aber die Meldung ist ja immerhin halbwegs klar. Dachte ich jedenfalls, und fing an, Klammern in den betroffenen Code-Bereichen zu zählen. Nach etwas Mühe, mehr Infos aus unserem Test-Setup heraus zu kitzeln, konnte ich den Fehler nun auf diesen stark vereinfachten Code herunterbrechen:
SELECT CAST( 12 AS VARCHAR2 ) FROM dual;
Ausgeführt unter Oracle 12c ergibt das tatsächlich obigen Fehler:
ORA-00906: missing left parenthesis
00906. 00000 - "missing left parenthesis"
*Cause:
*Action:
Error at Line: 1 Column: 29
Unter Postgres läuft das gleiche Statement durch (naja, wenn man „FROM dual“ weglässt und „VARCHAR“ als Datentyp nimmt). Unter Oracle ist aber eine Längenangabe nötig, also so:
SELECT CAST( 12 AS VARCHAR2( 100 ) ) FROM dual;
ORACLE, WIESO SAGST DU DAS NICHT EINFACH? Ich meine, man muss ja nicht gleich einen auf Karl Klammer machen, aber was spricht gegen eine Ausgabe á la „CAST: missing required datatype size parameter“???
In diesem speziellen Fall kam noch hinzu, dass diese Codezeile von 2007 stammt. Die einzige Veränderung war, dass ich kürzlich Leerzeichen um die Klammern eingefügt hatte. Das entspricht unserem Code-Style, rächt sich aber, wenn eine Datenbank-Schicht per RegEx Dinge in der Query anpasst und diese Anpassung dann nicht mehr greift, weil niemand an Leerzeichen gedacht hat.