Oracle 23c Preview: SQL und Datentypen

Safe Harbor Statement: alle in diesem Artikel enthalten Informationen stammen aus Oracle Vorträgen von der Oracle OpenWorld 2022 in Las Vegas. Da die Entwicklung der Oracle Datenbank 23c noch nicht abgeschlossen ist, können sich Funktionalitäten ändern oder ganz gestrichen werden.

Hinweis: für einige Funktionalitäten ist es Voraussetzung, dass COMPATIBLE >= 23.0.0 gesetzt ist.

Datentype: Boolean

Endlich ist er da, der Datentype Boolean!

CREATE TABLE foo (Status_text varchar(20), Status BOOLEAN);

INSERT INTO foo VALUES ('TRUE',TRUE);
INSERT INTO foo VALUES ('FALSE',FALSE);
INSERT INTO foo VALUES ('YES = TRUE','YES');
INSERT INTO foo VALUES ('Eins = TRUE',1);
INSERT INTO foo VALUES ('Null = FALSE',0);

COMMIT;

Dies hat Auswirkungen auf die WHERE Clause.

SELECT Status_text FROM foo WHERE status;

STATUS_TEXT
------------
TRUE
YES = TRUE
Eins = TRUE

Es ist für einen Oracle Entwickler/DBA ungewöhnlich, dass in der WHERE Clause nur eine Spalte ohne Bedingungen steht!

SELECT ohne FROM Clause

Viele andere Datenbanken (MS SQL, PostgreSQL,…) benötigen keine FROM Clause bei SELECT Statements. Bei Oracle 23c kann man auch darauf verzichten!

SELECT 2*21;

      2*21
----------
	42

Table Value Constructor für SQL und DDL

Damit kann man mehrere Datensätze auf einmal nutzen und muss nicht mehrere Einzelstatements schreiben.

INSERT INTO foo VALUES ('TRUE',TRUE),
                       ('FALSE',FALSE),
                       ('YES = TRUE','YES');

SELECT * 
  FROM (VALUES (1,'SCOTT'),
               (2,'BOB'),
               (3,'TIM')
       ) t1 (employee_id, first_name);
       
EMPLOYEE_ID FIRST
----------- -----
          1 SCOTT
          2 BOB
          3 TIM

Den Table Value Constructor kann man auch in WITH Clauses nutzen, um statische Daten für ein Statement ohne Tabellen zu definieren.

WITH mydata (Param, Wert) AS
( VALUES ('STATUS',17),
         ('CONFIG',42)
)
SELECT * FROM mydata;

PARAM   WERT
------- ----
STATUS    17
CONFIG    42

Im Execution Plan sieht man dies als „VALUE SCAN“.

Erweiterung zur RETURNING CLAUSE

Die RETURNING Clause gibt es bereits einige Zeit, um beispielsweise den Wert für den PK (aus einer Sequence via INSERT Trigger) zurück zu geben. Ab Oracle 23c gibt es für die RETURNING CLAUSE folgende Erweiterungen:

  • Es funktioniert für alle DML Statements (INSERT, UPDATE, DELETE, MERGE).
  • Man kann den OLD oder der NEW Value zurück geben. Der Default ist auch weiterhin der NEW Value.
RETURNING CLAUSE ::= { RETURN | RETURNING} { OLD | NEW } expr [, { OLD | NEW} expr ] ... INTO variable [, variable]...

UPDATE mit Joins

Wenn man bei Updates etwas aus anderen Tabellen benötigte, war das nur mit SUB-Select oder IN Clauses möglich. Mit Oracle 23c geht es viel einfacher:

UPDATE emp e SET e.sal = e.sal*2
  FROM dept d
 WHERE e.deptno = d.deptno
   AND d.dname = 'Sales';

GROUP BY Column Alias / Position

Man kann jetzt in GROUP BY Spalten-Aliases bzw. Spalten-Positionen nutzen und muss nicht mehr die Spalte/Funktionen hinschreiben.

SELECT dname, extract (year FROM hiredate) as hire_year, COUNT(*)
  FROM emp
  GROUP BY 1, hire_year
  HAVING hire_year >= 2000;

Einführung von SQL/PGQ – Property Graph Queries

Oracle arbeitet schon seit einigen Jahren an der Erweiterung von SQL und DDL, um den Umgang mit Property Graphen zu vereinfachen. Bisher wurde das mit eigenen Tools (Spatial & Graph) abgebildet. Mit Oracle 23c kann man nun direkt in SQL entsprechende Abfragen formulieren. Mit Graph Queries kann man Verbindungen in sozialen Netzwerken analysieren. Im Bankenumfeld eignen sich diese auch für Fraud detection und Money Laundering. In der Werbung (Freunde Deiner Freunde haben das Buch auch gelesen) lässt sich mit Graphen Queries arbeiten. Leider sind bei dem Vortrag keine Details zu den SQL und DDL Erweiterungen bekanntgegeben worden, es gibt jedoch ein Dokument aus 2020 mit einigen Beispielen, was kommen wird.

JSON Schema Validierung

Das Speichern von JSON in der Datenbank ist seit Oracle 19c möglich:

CREATE TABLE json_doc
  (id          VARCHAR2 (32) NOT NULL PRIMARY KEY,
   document    VARCHAR2 (23767) CONSTRAINT ensure_json CHECK (document IS JSON));

Oracle 21c bringt JSON als eigenen Datentype:

CREATE TABLE json_doc
  (id          VARCHAR2 (32) NOT NULL PRIMARY KEY,
   document    JSON);

Mit Oracle 23c kann man sicherstellen, dass nur gültige JSON Inhalte gespeichert werden, bzw. bestehende Daten auf Korrektheit geprüft werden können.

CREATE TABLE json_doc
  (id          VARCHAR2 (32) NOT NULL PRIMARY KEY,
   document    JSON VALIDATE 
      '{
         "type": "object",
         "properties:" {
                         "id": 
                         {"type": "number"}
                       }
       }'
   );
SELECT id, document FROM staging
 WHERE document IS JSON VALIDATE  
    '{
       "type": "object",
       "properties:" {
                       "id": 
                       {"type": "number"}
                     }
    }';

Durch den Datentype JSON (seit Oracle 21c) ist es möglich direkt mit SQL und DML auf die Dateninhalte von JSON Objekten zuzugreifen, während andere Session direkt mit JSON auf den gleichen Daten arbeiten.

Package DBMS_JSON_SCHEMA

Neues Package DBMS_JSON_SCHEMA ist zum Validieren der Daten gedacht und hat verschiedene Funktionen und Prozeduren, hier ein Beispiel:

SELECT DBMS_JSON_SCHEMA.VALIDATE_REPORT (document, schema) FROM json_doc;

Das SELECT liefert eine Liste aller Datensätze, die nicht der definierten Validierung entsprechen.


Das waren nur einige Beispiele von den Neuheiten in Oracle 23c – stay tuned!

Schreibe einen Kommentar

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.