Mit der Oracle 12c Release 12.1.0.2 hat die Oracle Datenbank JSON Unterstützung erhalten. JSON kann nun direkt gespeichert, abgefragt und auch indiziert werden. Im Folgenden soll dazu ein kurzer Überblick gegeben werden.
JSON steht für JavaScript Object Notation und beschreibt wie der Name schon ausdrückt eine Möglichkeit komplexe Objekte zu notieren und zu verarbeiten. Die Datenbank verwendet intern grundsätzlich immer UTF-8, entsprechend notwendige Konvertierungen bei der Ein- und Ausgabe werden automatisch durchgeführt.
Folgendes Beispiel eines Studenten soll dies verdeutlichen:
![JavaScript Object Notation Support in Oracle 12.1.0.2 1 Screenshot 2023 07 26 at 14 31 23 JavaScript Object Notation Support in Oracle 12.1.0.2 DBConcepts](https://www.dbconcepts.com/wp-content/uploads/2014/12/Screenshot-2023-07-26-at-14-31-23-JavaScript-Object-Notation-Support-in-Oracle-12.1.0.2-DBConcepts.png)
Um nun ein JSON speichern zu können wird eine simple VARCHAR2 oder bei größeren Objekten eine CLOB Spalte verwendet. Neu dazukommen ist der Check-Constraint IS JSON um sicherzustellen, dass die Spalte auch wirklich immer valide JSON-Syntax enthält.
Eine Tabelle mit einer JSON Spalte sieht dann z.B. folgendermaßen aus:
![JavaScript Object Notation Support in Oracle 12.1.0.2 2 Screenshot 2023 07 26 at 14 31 33 JavaScript Object Notation Support in Oracle 12.1.0.2 DBConcepts](https://www.dbconcepts.com/wp-content/uploads/2014/12/Screenshot-2023-07-26-at-14-31-33-JavaScript-Object-Notation-Support-in-Oracle-12.1.0.2-DBConcepts.png)
In diese Tabelle kann nun in die Spalte STUDENT_INFO ein Text im JSON-Format eingefügt ([…] wurde hier als Platzhalter verwendet) werden.
![JavaScript Object Notation Support in Oracle 12.1.0.2 3 Screenshot 2023 07 26 at 14 31 42 JavaScript Object Notation Support in Oracle 12.1.0.2 DBConcepts](https://www.dbconcepts.com/wp-content/uploads/2014/12/Screenshot-2023-07-26-at-14-31-42-JavaScript-Object-Notation-Support-in-Oracle-12.1.0.2-DBConcepts.png)
Die Daten können nun über eine ganz einfache Punkt-getrennte-Notation wie man sie von JavaScript kennt ausgelesen werden. Folgende SQL-Query ergibt z.B. das Ergebnis 123564869.
![JavaScript Object Notation Support in Oracle 12.1.0.2 4 Screenshot 2023 07 26 at 14 31 49 JavaScript Object Notation Support in Oracle 12.1.0.2 DBConcepts](https://www.dbconcepts.com/wp-content/uploads/2014/12/Screenshot-2023-07-26-at-14-31-49-JavaScript-Object-Notation-Support-in-Oracle-12.1.0.2-DBConcepts.png)
Es muss folgendes beachtet werden:
Die Schlüsselwerte sind case-sensitive – das gleiche muss in SQL berücksichtigt werden – das Statement oben würde kein Ergebnis liefern wenn statt „Matrikelnummer“ „matrikelnummer“ oder „MATRIKELNUMMER“ geschrieben wird. Sollten Leerzeichen oder Sonderzeichen wir Umlaute im Key sein – was grundsätzlich zu vermeiden ist – dann muss die entsprechende Angabe unter Anführungszeichen gesetzt werden also z.B.:
![JavaScript Object Notation Support in Oracle 12.1.0.2 5 Screenshot 2023 07 26 at 14 31 56 JavaScript Object Notation Support in Oracle 12.1.0.2 DBConcepts](https://www.dbconcepts.com/wp-content/uploads/2014/12/Screenshot-2023-07-26-at-14-31-56-JavaScript-Object-Notation-Support-in-Oracle-12.1.0.2-DBConcepts.png)
Sollte es sich um ein verschachteltes Objekt handeln so wird die Punkt-getrennte-Notation einfach auf allen Ebenen angewandt bis man bei dem gewünschten Wert angelangt ist.
Oracle bietet noch drei Funktionen die in SQL oder PL/SQL verwendet werden können die ich hier noch kurz beschreiben will: JSON_VALUE, JSON_QUERY, JSON_TABLE und JSON_EXISTS.
Allgemein nutzen alle JSON-Pfad-Notationen. Diese entspricht der Punkt-getrennten Notation die bereits besprochen wurde, und kann auch Elemente aus Arrays nutzen.
JSON_VALUE
Selektiert einen Wert wie zum Beispiel mit dem Ergebnis „Business English“ bei folgendem Query:
![JavaScript Object Notation Support in Oracle 12.1.0.2 6 Screenshot 2023 07 26 at 14 32 09 JavaScript Object Notation Support in Oracle 12.1.0.2 DBConcepts](https://www.dbconcepts.com/wp-content/uploads/2014/12/Screenshot-2023-07-26-at-14-32-09-JavaScript-Object-Notation-Support-in-Oracle-12.1.0.2-DBConcepts.png)
JSON_EXISTS
Prüft ob ein bestimmer Schlüssel im JSON existiert. Das erste Query gibt ein Datum zurück bei allen Zeilen, denn das Array hat ein zweites Element (0 ist der Start-Index). Das zweite Query gibt nichts zurück da das Array nur 3 Elemente hat (und [3] das vierte Element abfragt).
![JavaScript Object Notation Support in Oracle 12.1.0.2 7 Screenshot 2023 07 26 at 14 32 16 JavaScript Object Notation Support in Oracle 12.1.0.2 DBConcepts](https://www.dbconcepts.com/wp-content/uploads/2014/12/Screenshot-2023-07-26-at-14-32-16-JavaScript-Object-Notation-Support-in-Oracle-12.1.0.2-DBConcepts.png)
JSON_QUERY
Im Gegensatz zu JSON_VALUE wird hier ein Teilstück des JSON selektiert und nicht nur ein Wert, folgendes Query gibt die Liste der Fächer zurück:
![JavaScript Object Notation Support in Oracle 12.1.0.2 8 Screenshot 2023 07 26 at 14 32 24 JavaScript Object Notation Support in Oracle 12.1.0.2 DBConcepts](https://www.dbconcepts.com/wp-content/uploads/2014/12/Screenshot-2023-07-26-at-14-32-24-JavaScript-Object-Notation-Support-in-Oracle-12.1.0.2-DBConcepts.png)
JSON_TABLE
Diese Funktion dient dazu JSON-Daten in eine virtuelle Tabellenform zu überführen. Sie bietet damit die Möglichkeit im FROM-Teil der Query eingesetzt zu werden und dadurch mehrere Werte auf einmal ohne mehrmaliges Aufrufen von JSON_VALUE oder JSON_QUERY zu selektieren. Das bringt einen Geschwindigkeitsvorteil da die Daten so nur einmal geparst werden und nicht für jeden Funktionsaufruf immer wieder.
![JavaScript Object Notation Support in Oracle 12.1.0.2 9 Screenshot 2023 07 26 at 14 32 31 JavaScript Object Notation Support in Oracle 12.1.0.2 DBConcepts](https://www.dbconcepts.com/wp-content/uploads/2014/12/Screenshot-2023-07-26-at-14-32-31-JavaScript-Object-Notation-Support-in-Oracle-12.1.0.2-DBConcepts.png)
Die neuen JSON Funktionen bieten nützliche Werkzeuge, gerade im Zusammenhang mit APEX, dass durch seine Web-Browser Basis JavaScript massiv nutzt können sich dadurch hilfreiche Vereinfachungen implementieren lassen.
Weitere Infos zu JSON in der Oracle Datenbank finden sie hier:
http://docs.oracle.com/database/121/ADXDB/json.htm
![JavaScript Object Notation Support in Oracle 12.1.0.2 10 CH klein](https://www.dbconcepts.com/wp-content/uploads/2022/06/CH_klein.jpg)
Christoph Hillinger ist Senior Oracle Developer und seit vielen Jahren Oracle APEX und ODI Spezialist bei DBConcepts.