Oracle: Number zu String casten

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 ehr greift, weil niemand an Leerzeichen gedacht hat.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Bitte beachte die Kommentarregeln: 1) Kein Spam, und bitte höflich bleiben. 2) Ins Namensfeld gehört ein Name. Gerne ein Pseudonym, aber bitte keine Keywords. 3) Keine kommerziellen Links, außer es hat Bezug zum Beitrag. mehr Details...

So, noch mal kurz drüber schauen und dann nichts wie ab damit. Vielen Dank fürs Kommentieren! :-)