Seit Mitte Mai 2022 ist das neue IBM i Release 7.5 verfügbar und natürlich hat es auch im Bereich der Datenbank Db2 for i und SQL einige Neuerungen gegeben. Dieser Artikel gibt zunächst einen Überblick über die funktionalen Erweiterungen.

Neben einer Reihe von funktionalen Erweiterungen und Performance-Verbesserungen werden auch in Release 7.5 eine Reihe von neuen IBM i und Db2 for i Services zur Verfügung gestellt. Während die funktionalen Erweiterungen und die Performance-Verbesserungen nur in Release 7.5 genutzt werden können, werden die neuen und erweiterten Db2 for i und SQL Services auch für Release 7.4 und 7.3 via PTF zur Verfügung gestellt.

Schauen wir uns zunächst die funktionalen Neuerungen im Detail an:

Neuer Datentyp – Boolean

Mit Release 7.5 wird ein neuer Datentyp Boolean eingeführt. Dieser Datentyp entspricht einem Schalter und kann nur die Werte TRUE/FALSE oder UNKNOWN annehmen.

Der Datentyp kann beim Definieren von Spalten in SQL-beschriebenen Tabellen oder aber auch zur Definition von Variablen und Parametern in SQL-Routinen verwendet werden. In DDS-beschriebenen Dateien wird der Datentyp BOOLEAN nicht unterstützt.

Auch wenn ein neuer Datentyp, als die „große“ Neuerung in Release 7.5 ein bisschen dürftig erscheint – zumindest im Vergleich zu den Neuerungen der letzten Releases (z.B. Db2 Mirror, Temporale Tabellen, Row and Column Access Control) – so gibt es in Zusammenhang mit dem neuen Datentypen BOOLEAN jede Menge Erweiterungen:

Boolean Datentyp

Spalten und Variablen werden lediglich mit dem Schlüssel-Wort BOOLEAN ohne Längenangabe definiert.

Konvertierung

Die folgenden alphanumerischen Werte (in jeglicher Groß/Kleinschreibung) können mit den Funktionen CAST() und TRY_CAST() oder der Funktion BOOLEAN() in den Boolean-Wert TRUE konvertiert werden:

  • ‚t‘ , ‚true‘ , ‚y‘, ‚yes‘ , ‚on‘ ,’1′

Die folgenden alphanumerischen Werte (in jeglicher Groß/Kleinschreibung) können in den Boolean-Wert FALSE konvertiert werden.

  • ‚f‘, ‚false‘, ’n‘, ’no‘, ‚off‘, ‚0‘

Bei numerischen Werten, kann der Wert 0 in FALSE und der Wert 1 in TRUE konvertiert erden.

Vergleiche

Ein Boolean-Wert kann direkt mit einem anderen Boolean-Wert oder einem alphanumerischen oder numerischen Wert, der sich in einen Boolean-Wert konvertieren lässt, verglichen werden.

Neue skalare Funktionen

BOOLEAN(), ISTRUE(), ISNOTTRUE(), ISFALSE(), ISNOTFALSE(),

Neue Aggregat-Funktionen

ANY()/SOME(), EVERY()

Boolean Prädikate

IS TRUE, IS FALSE, IS NOT TRUE, IS NOT FALSE

Boolean Konstanten

TRUE, FALSE, ON, OFF (in jeglicher Groß/Kleinschreibung)

ILE Compiler

Die ILE-Compiler wurden dahingehend erweitert, dass Boolean-Spalten auch mit Native I/O verarbeitet werden können.

In RPG werden Boolean Spalten in (RPG-)Datentyp IND konvertiert und in Cobol in PIC 1

Embedded SQL

Bei embedded SQL in RPG können Boolean-Werte in Host-Variablen, die mit dem RPG-Datentypen IND definiert sind, übernommen werden.

In Cobol-Programmen sollten die Host-Variablen für Boolean-Werte als PIC 1 definiert werden.

Boolean und XML

Beim Erstellen von XML-Elementen, werden bei Daten-Typ BOOLEAN die Werte true und false ausgegeben.

Bei der Verarbeitung von XML-Dokumenten über XMLTABLE können die Werte true und false direkt in BOOLEAN-Werte konvertiert werden.

Boolean und JSON

Die Boolean-Werte werden direkt in die JSON-Literale true und false konvertiert.

Bei der Verarbeitung von JSON-Daten über JSON_TABLE können die JSON-Literale true und false wahlweise in die alphanumerischen Werte true/false sowohl im Single als auch Double Byte Character Set oder in Integer-Werte (0/1) oder in Boolean-Werte konvertiert werden.

Die JSON-Literale true/false können nicht direkt in die alphanumerischen Werte ‘0‘/‘1‘ konvertiert werden. Dafür ist ein Zwischenschritt erforderlich. Entweder man gibt die Literale zunächst als Integer-Werte aus und konvertiert diese dann in  alphanumerische Werte oder man konvertiert die Boolean-Werte mit Hilfe einer CASE-Anweisung in ‘0‘/‘1‘.

System-APIs

Boolean Support in System-APIs wie QDBRTVFD, QUSLFLD, QSQGNDDL u.a. integriert

CL-Befehle

Boolean Support in CL-Befehle wie DSPPFD, OPNDBF, CPYF, CPYTOIMPF, CPYFRMIMPF u.a. integriert

Catalogs

Boolean Support in Catalog Views wie SYSCOLUMNS, SYSPARMS, SYSVARIABLES u.a., integriert.

Externe Interfaces

Boolean Support wird auch in externen Interfaces wie SQL CLI, JDBC, ODBC, DRDA, OLE DB, .NET unterstützt

Tools

Boolean Support in IBM i Access Client Solutions (ACS) und iNavigator integriert.

 

In der folgenden Abbildung wird eine Tabelle mit mehreren Boolean Spalten definiert. Der Datentyp BOOLEAN wird ohne Längenangaben angegeben. Der Default-Wert für die Boolean-Spalten wird mit False angegeben. Eine Einbettung des Default-Wertes in Hochkommata ist nicht zulässig und führt zu einem Fehler.

Erstellen Tabelle mit Boolean SpaltenQuelle: Hauser

Erstellen einer Tabelle mit Boolean Spalten

In der folgenden Abbildung werden Datensätze mit Boolean Werten in die zuvor erstellte Tabelle MYBOOLEAN eingefügt. Das darauffolgende SELECT-Statement zeigt dann die eingefügten Datensätze an. Boolean-Werte werden immer als true und false angezeigt (auch wenn die Hex-Werte F0=true und F1=false sind.

Einfügen/Anzeigen Daten-Sätze mit Boolean-Spalten/WertenQuelle: Hauser

Einfügen/Anzeigen Daten-Sätze mit Boolean-Spalten/Werten

Was man mit dem Boolean-Datentypen alles machen kann, wird in einem eigenen Artikel aufgezeigt.

Erweiterung IF EXISTS für alle DROP-Statements (Lösch-Befehle)

Mit Hilfe des SQL-Befehls DROP kann jedes Datenbanken-Objekt (mit allen abhängigen Datenbanken-Objekten gelöscht werden.

Für die meisten CREATE-Befehle gibt es die Erweiterung OR REPLACE, so dass ein vorhandenes Datenbanken-Objekt durch das erneute Ausführen des CREATE OR REPLACE-Statement ersetzt wird.

Für den Befehl CREATE INDEX gibt es jedoch die Erweiterung OR REPLACE nicht und der Versuch einen vorhandenen Index erneut zu erstellen führt zu einem Fehler. Deshalb wird in vielen SQL Skripten zunächst versucht, einen eventuell vorhandenen Index zu löschen. Sofern der Index vorhanden ist, wird er gelöscht. Versucht man jedoch ein nicht vorhandenes Datenbanken-Objekt mit einem DROP-Befehl zu löschen, wird ein Fehler ausgegeben.

Vor der Erweiterung IF EXISTS konnte man in den SQL Skripten lediglich ein dynamisches Compound Statement einfügen, in dem das DROP-Statement ausgeführt wurde. Ebenso musste man einen Continue Handler hinterlegen über dem der Fehler behandelt wird, der beim Versuch ein nicht vorhandenes Datenbanken-Objekt zu löschen auftritt.

Mit einem der letzten Technology Refreshes wurden alle DROP-Statements um die Option IF EXISTS erweitert. Das bedeutet, dass das DROP Statement nur ausgeführt wird, wenn das zu löschende Datenbanken-Objekt auch wirklich vorhanden ist.

Die folgende Abbildung zeigt zunächst ein DROP INDEX Statement, bei dem versucht wird einen nicht vorhandenen Index zu löschen. Die Ausführung wird mit einem Fehler beendet. In dem zweiten Bild wird versucht den gleichen (nicht vorhandenen) Index zu löschen. Da in dem DROP-Statement jedoch IF EXISTS angegeben wurde, wird das DROP-Statement problemlos ausgeführt.

DROP IF EXISTS - Löschen nicht vorhandener Datenbanken-ObjekteQuelle: Hauser

DROP IF EXISTS – Löschen nicht vorhandener Datenbanken-Objekte

Erweiterung RESTRICT ON DROP für CREATE TABLE und ALTER TABLE

Mit dem Befehl DROP TABLE können SQL Tabellen oder physische Dateien sowie die davon abhängigen Datenbanken-Objekte (wie Indices, Views, Trigger) gnadenlos ohne Rücksicht auf Verluste und sogar ohne zusätzliche Bestätigung gelöscht werden.

Das ist natürlich kritisch.

Deshalb wurde mit Release 7.5 eine Erweiterung RESTRICT ON DROP für die Befehle CREATE (OR REPLACE) TABLE und ALTER TABLE eingeführt. Die Erweiterung wird am Ende des CREATE OR REPLACE TABLE-Statements mit WITH RESTRICT ON DROP oder beim ALTER TABLE STATEMENT mit ADD RESTRICT ON DROP angegeben.

Das folgende Beispiel zeigt die Erstellung bzw. Änderung einer Tabelle mit der RESTRICT ON DROP-Anweisung:

CREATE/ALTER TABLE-Statements mit RESTRICT ON DROPQuelle: Hauser

CREATE/ALTER TABLE-Statements mit RESTRICT ON DROP

Wird versucht, eine Tabelle/physische Datei, bei der das Attribut RESTRICT ON DROP gesetzt ist mit dem SQL-Befehl DROP zu löschen, wird der Befehl mit dem SQLCODE -672 bzw. der SQL-Status 55035 (Drop für Datei in Bibliothek Art *FILE nicht zulässig) abgebrochen.

Die folgende Abbildung zeigt die Fehlermeldung, die ausgegeben wird, wenn versucht wird eine Tabelle/physische Datei zu löschen, die mit der Option RESTRICT ON DROP erstellt wurde.

Versuch Tabelle mit RESTRICT ON DROP-Attribut zu löschenQuelle: Hauser

Versuch Tabelle mit RESTRICT ON DROP-Attribut zu löschen

Auch der Versuch die Tabelle/physische Datei mit dem CL-Befehl DLTF zu löschen geht schief. In diesem Fall wird die CPF-Nachricht CPF210F (Operation für Objekt in Bibliothek der Art *FILE war nicht erfolgreich) ausgegeben.

Um eine Tabelle/physische Datei mit der Option RESTRICT ON DROP dennoch löschen zu können, muss die Option RESTRICT ON DROP zunächst entfernt werden. Dies geschieht mit dem Befehl ALTER TABLE und der Erweiterung DROP RESTRICT ON DROP.

Die folgende Abbildung zeigt den ALTER TABLE-Befehl, mit dem die Restriktion wieder von der Tabelle entfernt werden kann.

ntfernen RESTRICT ON DROP-Attribut von TabelleQuelle: Hauser

Entfernen RESTRICT ON DROP-Attribut von Tabelle

Die Catalog-View SYSTABLES wurde um die Spalte RESTRICT_ON_DROP erweitert. Je nachdem, ob die Option RESTRICT ON DROP gesetzt wurde, enthält diese Spalte YES oder NO.

Die folgende Abbildung zeigt eine Liste aller Tabellen, in der Bibliothek HSCOMMON10, die die Option RESTRICT ON DROP enthalten.

Erweiterung Catalog View SYSTABLES - Neue Spalte RESTRICT_ON_DROPQuelle: Hauser

Erweiterung Catalog View SYSTABLES – Neue Spalte RESTRICT_ON_DROP

Soweit der Überblick über den neuen BOOLEAN-Datentypen und den Erweiterungen in der DROP-Befehlen und dem CREATE OR REPLACE TABLE bzw. ALTER TABLE Statement. In einem weiteren Artikel werden wir uns mit den neuen Funktionen, die in Release 7.5 (oder einem der letzten Technology-Refreshes) eingeführt wurden, beschäftigen.

Birgitta Hauser ist Spezialistin für SQL- und RPG-Programmierung und IBM Champion.

Frau Hauser gibt regelmäßig Workshops im Rahmen der MIDRANGE ACADEMY.

Sie schreibt regelmäßig für MIDRANGE und den TechKnowLetter. Hier erhalten Sie brandneue, tiefe Informationen zu SQL, RPG und vielem mehr.

Der TechKnowLetter erscheint monatlich. Sechs Ausgaben erhalten Sie für 88 Euro hier.