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!