Grundlegende Syntaxbestandteile

Dieses Dokument behandelt grundlegende Syntaxbestandteile, die dann in den Beschreibungen der einzelnen Statements nicht mehr näher erläutert werden.

Dieses Dokument behandelt folgende Themen:


Konstanten

Die in den Syntaxbeschreibungen von Natural-SQL-Statements verwendeten Konstanten sind:

constant Das Element constant bezieht sich immer auf eine Natural-Konstante.
integer Das Element integer bezieht sich immer auf eine Ganzzahl-Konstante.

Anmerkung:
Wenn das Dezimalzeichen mit dem (Session-Parameter DC) auf Komma (,) gesetzt ist, darf unmittelbar nach einer numerischen Konstanten kein Komma angegeben werden, sondern es muss ein Leerzeichen dazwischen stehen, weil es sonst zu einem Systemfehler kommt oder zu falschen Ergebnissen kommen kann.

Ungültige Syntax: Gültige Syntax:

VALUES (1,'A') führt zu einem Syntaxfehler.

VALUES (1,2,3) führt zu falschen Ergebnissen.

VALUES (1 ,'A')

VALUES (1 ,2 ,3)

SQL-Datetime-Konstanten

Eine SQL-Datetime-Konstante ist eine Zeichenkettenkonstante mit besonderem Format, die Folgendes angibt:

DATE string-constant SQL-Datumskonstante, zum Beispiel: DATE '2013-15-01'.
TIME string-constant SQL-Uhrzeitkonstante, zum Beispiel: TIME '10:30:15'.
TIMESTAMP string-constant SQL-Zeitstempelkonstante, zum Beispiel: TIMESTAMP '2014-15-01 10:20:15.123456'.

Informationen zu den gültigen string-constant-Formaten siehe IBM's DB2 SQL reference information

Namen

Die in den Syntaxbeschreibungen von Natural-SQL-Statements verwendeten Namen sind:

authorization-identifier

Ein authorization-identifier, der auch "creator name" genannt wird, dient zur Qualifizierung von Datenbanktabellen und Views. Siehe auch authorization-identifier unter table-name weiter unten.

ddm-name

Ein ddm-name ist immer der Name eines mit der Natural-Utility SYSDDM erzeugten Natural Data Definition Module (DDM).

view-name

Ein view-name ist immer der Name eines im DEFINE DATA-Statement definierten Natural View.

column-name

Ein column-name ist immer der Name einer physischen Datenbankspalte.

location-name

Ein location-name bezeichnet den Standort einer Tabelle. Die Angabe des location-name ist optional (gehört zum SQL Extended Set).

table-name

Das Element table-name in diesem Kapitel dient zur Referenzierung von SQL-Basistabellen und SQL-Viewed-Tabellen.

Syntax:

[[location-name.]authorization-identifier.]ddm-name

Syntax-Element-Beschreibung:

Syntax-Element Beschreibung
ddm-name Für jede Tabelle muss ein entsprechendes Natural-DDM existieren. Der Name dieses DDM muss mit dem Namen der entsprechenden physischen Datenbanktabelle bzw. des View identisch sein.
location-name Dieses optionale Element bezeichnet den Standort der Tabelle, auf die zugegriffen werden soll.
authorization-identifier Es gibt zwei Arten, den authorization-identifier einer Datenbanktabelle bzw. eines View anzugeben.

Die eine Art entspricht der Standard-SQL-Syntax: authorization-identifier und Tabellenname werden durch einen Punkt miteinander verbunden. Hierbei muss der DDM-Name dem Namen der physischen Datenbanktabelle (ohne den authorization-identifier) entsprechen.

Beispiel:

DEFINE DATA LOCAL 
01 PERS VIEW OF PERSONNEL 
   02 NAME 
   02 AGE 
END-DEFINE 
SELECT * 
  INTO VIEW PERS 
  FROM SQL.PERSONNEL 
...

Die andere Möglichkeit besteht darin, den authorization-identifier als Teil des DDM-Namens selbst zu definieren. Der DDM-Name besteht dann aus dem authorization-identifier gefolgt von einem Bindestrich (−) und gefolgt vom Namen der Datenbanktabelle. Intern wird der Bindestrich zwischen authorization-identifier und Tabellennamen in einen Punkt umgesetzt.

Anmerkung:
Diese Form des DDM-Namens kann auch in einem FIND- oder READ-Statement verwendet werden, da sie den für diese Statements geltenden DDM-Namenskonventionen entspricht.

Beispiel:

DEFINE DATA LOCAL 
01 PERS VIEW OF SQL-PERSONNEL 
   02 NAME 
   02 AGE 
END-DEFINE 
SELECT * 
  INTO VIEW PERS 
  FROM SQL-PERSONNEL 
...

Wenn der authorization-identifier weder explizit noch als Teil des DDM-Namens angegeben wird, wird er vom betreffenden SQL-Datenbanksystem bestimmt.

Die table-names können nicht nur in SELECT-Statements verwendet werden, sondern auch in den Statements DELETE, INSERT und UPDATE.

Beispiel:

... 
DELETE FROM SQL.PERSONNEL 
  WHERE AGE IS NULL 
 ... 
    
... 
INSERT INTO SQL.PERSONNEL (NAME,AGE) 
  VALUES ('ADKINSON',35) 
... 
    
... 
UPDATE SQL.PERSONNEL 
SET SALARY = SALARY * 1.1 
WHERE AGE > 30 
...

correlation-name

Der correlation-name ist ein Alias-Name für einen table-name. Er kann zur Qualifizierung von Spaltennamen verwendet werden. Außerdem dient er dazu, implizit Felder in einem Natural-View zu qualifizieren, der in der INTO-Klausel eines SELECT-Statements verwendet wird.

Beispiel:

DEFINE DATA LOCAL 
01 PERS-NAME    (A20) 
01 EMPL-NAME    (A20) 
01 AGE          (I2) 
END-DEFINE 
... 
SELECT X.NAME , Y.NAME , X.AGE 
  INTO PERS-NAME , EMPL-NAME , AGE 
  FROM SQL-PERSONNEL X , SQL-EMPLOYEES Y 
  WHERE X.AGE = Y.AGE 
END-SELECT 
...

Die Verwendung von correlation-names ist zwar in der Regel nicht nötig, kann aber helfen, die Lesbarkeit eines Statements zu erleichtern.

Parameter

Syntax des Elements parameter:

[[:sql-type]:] host-variable [INDICATOR [:] host-variable] [LINDICATOR [:] host-variable]

Syntax-Element-Beschreibung:

Syntax-Element Beschreibung
sql-type Ein sql-type gibt den SQL-Datentyp der host-variable an, wenn sie für den Zugriff auf DB2 verwendet wird. Die Angabe des sql-type ist optional, weil die meisten SQL-Datentypen implizit zu Natural-Host-Variablen zugeordnet werden. Für einige Natural-Host-Variablen kann der SQL-Datentyp jedoch nicht implizit zugeordnet werden.

sql-type gehört zum SQL Extended Set.

Wenn ein sql-type angegeben wird, muss er mit Doppelpunkten (:) umgeben sein. Gültige SQL-Datentypen sind:

sql-type Natural-Format DB2 SQL-Datentyp
BLOBFILE group(I4,I4,I4,A255) BLOB file reference(916/917)
CLOBFILE group(I4,I4,I4,A255) CLOB file reference(920/921)
DBCLOBFILE group(I4,I4,I4,A255) DBCLOB file reference(924/925)
BLOBLOC (I4) BLOB locator960/961)
CLOBLOC (I4) CLOB locator(964/965)
DBCLOBLOC (I4) DBCLOB locator(968/969)
Siehe auch Natural-Formate und SQL-Datentypen.
host-variable Eine host-variable ist eine in einem SQL-Statement referenzierte Natural-Programmvariable (keine Systemvariable), die entweder ein eigenständiges Feld oder Teil eines View sein kann.

Wenn sie als empfangendes Feld (z.B. in einer INTO-Klausel) definiert wird, ist die host-variable ein Feld, dem vom Datenbanksystem einen Wert zugeordnet wird.

Wenn sie als sendendes Feld (z.B. in einer WHERE-Klausel) definiert wird, ist die host-variable ein Feld, dessen Wert vom Programm an das Datenbanksystem übergeben wird.

Siehe auch Natural-Formate und SQL-Datentypen.

[:]
Doppelpunkt:

Gemäß den SQL-Standards kann einer host-variable ein Doppelpunkt (:) vorangestellt werden. Bei der Verwendung mit flexibler SQL muss ihr ein Doppelpunkt vorangestellt werden.

Beispiel:

SELECT NAME INTO :#NAME FROM PERSONNEL 
WHERE AGE = :VALUE

Wenn ein Variablenname mit einem für SQL reservierten Wort identisch ist, ist der Doppelpunkt ebenfalls erforderlich. In Situationen, in denen entweder eine host-variable oder eine Spalte referenziert werden kann, wird ein Name ohne Doppelpunkt als Referenz auf eine Spalte interpretiert.

INDICATOR
INDICATOR-Klausel:

Diese Klausel ist optional und dient dazu, herauszufinden, ob eine zu lesende Spalte "Null" ist, d.h. keinen Wert enthält, oder tatsächlich den Wert Null (0) bzw. Leerzeichen enthält.

Wenn sie mit einer empfangenden host-variable (Zielfeld) verwendet wird, dient die INDICATOR host-variable (Null-Indikatorfeld) dazu, herauszufinden, ob eine zu lesende Spalte "Null" ist.

Beispiel:

DEFINE DATA LOCAL 
1 NAME      (A20) 
1 NAMEIND   (I2) 
END-DEFINE 
SELECT * 
  INTO NAME INDICATOR NAMEIND 
...

In diesem Beispiel ist NAME die empfangende host-variable und NAMEIND das Null-Indikatorfeld.

Ist ein Null-Indikatorfeld angegeben und die gelesene Spalte ist Null, wird das Indikatorfeld auf einen negativen Wert und das Zielfeld je nach Datentyp auf Null (0) bzw. Leerzeichen gesetzt. Andernfalls ist der Wert des Null-Indikatorfeldes größer als oder gleich Null (0).

Wenn sie mit einer sendenden host-variable (Quelldatenfeld) verwendet wird, dient das Null-Indikatorfeld dazu, diesem Feld einen Nullwert zuzuweisen.

Beispiel:

DEFINE DATA LOCAL 
1 NAME      (A20) 
1 NAMEIND   (I2) 
UPDATE ... 
SET NAME = :NAME INDICATOR :NAMEIND 
WHERE ...

In diesem Beispiel ist :NAME die sendende host-variable und :NAMEIND das Null-Indikatorfeld. Durch Eingabe eines negativen Wertes für das Null-Indikatorfeld wird der Datenbankspalte ein Nullwert zugeordnet.

Eine INDICATOR host-variable hat Format/Länge I2.

LINDICATOR
LINDICATOR-Klausel:

Diese Klausel ist optional und dient zur Unterstützung von Spalten mit variabler Länge, z.B. des Typs VARCHAR oder LONG VARCHAR.

Wenn sie mit einer empfangenden host-variable (Zielfeld) verwendet wird, enthält die LINDICATOR host-variable (Längen-Indikatorfeld) die Anzahl der tatsächlich von der Datenbank in das Zielfeld geschriebenen Zeichen. Das Zielfeld wird immer mit Leerzeichen aufgefüllt.

Enthält die VARCHAR- bzw. LONG VARCHAR-Spalte mehr Zeichen, als in das Zielfeld passen, wird im Längen-Indikatorfeld die Anzahl der tatsächlich gelesenen Zeichen ausgegeben und im Null-Indikatorfeld (falls angegeben) die tatsächliche Gesamtlänge der Spalte.

Beispiel:

DEFINE DATA LOCAL 
1 ADDRESSLIND (I2) 
1 ADDRESS     (A50/1:6) 
END-DEFINE 
SELECT * 
  INTO :ADDRESS(*) LINDICATOR :ADDRESSLIND 
  ...

In diesem Besipiel erhält :ADDRESS(*) die ersten 300 Bytes (falls vorhanden) der adressierten VARCHAR- bzw. LONG VARCHAR-Spalte, und :ADDRESSLIND ist das Längen-Indikatorfeld, das die Anzahl der tatsächlich von der Datenbank zurückgelieferten Zeichen enthält.

Wenn es mit einer sendenden host-variable (Quellendatenfeld) verwendet wird, gibt das Längen-Indikatorfeld an, wieviele Zeichen des Quellendatenfeldes an die Datenbank übergeben werden sollen.

Beispiel:

DEFINE DATA LOCAL 
1 NAMELIND  (I2) 
1 NAME      (A20) 
1 AGE       (I2) 
END-DEFINE 
MOVE  4     TO NAMELIND 
MOVE 'ABC%' TO NAME 
SELECT AGE 
  INTO :AGE 
WHERE NAME LIKE :NAME LINDICATOR :NAMELIND 
  ...

Eine LINDICATOR host-variable hat Format/Länge I2 oder I4. Um Verarbeitungszeit zu sparen, sollte sie unmittelbar vor dem betreffenden Ausgangs- bzw. Zielfeld angegeben werden; andernfalls würde sie zur Laufzeit in einen Zwischenspeicher kopiert.

Wenn das LINDICATOR-Feld als I2-Feld definiert ist, wird der SQL-Datentyp VARCHAR zum Senden/Erhalten der betreffenden Spalte verwendet. Wird die LINDICATOR host-variable als I4 angegeben, wird ein großer Objektdatentyp (CLOB/BLOB) verwendet.

Wenn das Feld als DYNAMIC (dynamisch) definiert ist, wird die Spalte in einer internen Schleife bis zu ihrer wirklichen Länge gelesen. Das LINDICATOR-Feld und *LENGTH werden auf diese Länge gesetzt. Bei Feldern fester Länge wird die Spalte bis zur definierten Länge gelesen. In beiden Fällen wird das Feld bis zum im LINDICATOR-Feld definierten Wert geschrieben.

Ein Feld fester Länge soll zum Beispiel mit einem als I2 angegebenen LINDICATOR-Feld definiert werden. Wenn die VARCHAR-Spalte mehr Zeichen enthält als in dieses Feld fester Länge passen, wird das Längenindikatorfeld auf die tatsächlich zurückgegebene Länge gesetzt, und das Nullindikatorfeld (falls angegeben) wird auf die Gesamtlänge dieser Spalte (Lesen) gesetzt. Dies ist bei Feldern fester Länge >= 32 KB nicht möglich (die Länge ist größer gewählt als die Länge des Nullindikatorfeldes).

Include Columns-Klausel

Diese Klausel gehört zum SQL Extended Set. Sie steht in den folgenden Statements zur Verfügung: DELETE, INSERT, MERGE und UPDATE.

Syntax der include-columns-Klausel:

INCLUDE (column-name data-type,...)

Syntax-Element-Beschreibung:

Syntax-Element Beschreibung
INCLUDE Mit dem Schlüsselwort INCLUDE wird eine Liste mit Spalten eingeleitet, welche in die Ergebnistabelle eines DELETE-, INSERT-, MERGE- oder UPDATE-Statements aufgenommen werden soll. INCLUDE kann nur dann angegeben werden, wenn ein DELETE-, INSERT-, MERGE- oder UPDATE-Statement in der FROM-Klausel eines SELECT-Statements verschachtelt ist.
column-name Gibt den Namen einer Spalte der Ergebnistabelle des MERGE-Statements an, der nicht derselbe Name ist wie der einer anderen include-column oder einer Spalte in der Zieltabelle.
data-type Gibt den Datentyp der include-column an. Siehe data-type weiter unten.

data-type

built-in-type

distinct-type

Syntax-Element-Beschreibung:

Syntax-Element Beschreibung
built-in-type Specifies a built-in data type. See the IBM DB2 for z/OS documentation for a description of built-in types.
distinct-type Specifies a distinct type.

Period-Klausel

Diese Klausel gehört zum SQL Extended Set. Sie steht in den folgenden Statements zur Verfügung: Searched DELETE und Searched UPDATE.

Syntax:

FOR PORTION OF BUSINESS_TIME FROM expr1 TO expr2

Syntax-Element-Beschreibung:

Syntax-Element Beschreibung
FOR PORTION OF BUSINESS_TIME Gibt an, das das DELETE- oder UPDATE-Statement nur für Zeilenwerte für den Teil der BUSINESS_TIME-Zeitraum in der Zeile gilt, der durch die Period-Klausel angegeben wird.

BUSINESS_TIME muss ein Zeitraum sein, der für die im DELETE- und UPDATE-Statement referenzierte Tabelle definiert ist.

FROM expr1 TO expr2 Gibt an, dass die Aktualisierung für Spalten für den Zeitraum gilt, der mit FROM expr1 TO expr2 angegeben wird.

Falls der Zeitraum, welcher durch den Startwert und den Endewert für die BUSINESS_TIME einer Zeile angegeben ist, vollständig in dem angegebenen Zeitraum enthalten ist (falls der Startwert für den Zeitraum in der Zeile kleiner ist als expr2 und der Endewert für den Zeitraum in der Zeile größer ist als expr1), wird diese Zeile aktualisiert bzw. gelöscht, und die Start- und Endewerte für diesen BUSINESS_TIME-Zeitraum bleiben unverändert.

If the period that is specified by the start value and the end value for the BUSINESS_TIME of a row is only partially contained in the specified period (if the start value for the period in the row is greater than expr2 or the end value for the period in the row is less than expr1), that row is updated or deleted and then one or two additional rows are inserted. The inserted rows represent the original row values for the periods that were not updated or deleted by the update operation. For the inserted rows, the start value and end value for the BUSINESS_TIME are set in such a way that either the start value for the BUSINESS_TIME is the start value for the BUSINESS_TIME of the original row and the end value is expr1, or the start value is expr2 and the end value is the end value for the BUSINESS_TIME of the original row.

expr1 and expr2 Geben Sie Ausdrücke an, die einen Wert eines "eingebauten" Datentyps zurückliefern.

Das Ergebnis eines jeden Ausdrucks muss mit dem Datentyp der Spalten des angegebenen Zeitraums vergleichbar sein. Eins Zeitstempel mit TIME ZONE ist als der Ergebnisdatentyp für expr1 oder expr2 nicht zulässig.

Natural-Formate und SQL-Datentypen

Das Natural-Format einer host-variable wird entsprechend der folgenden Tabelle in einen SQL-Datentyp umgesetzt:

Natural-Format/Länge SQL-Datentyp
An, A DYNAMIC CHAR (n) , VARCHAR(n), CLOB(n)
B2 SMALLINT
B4 INT
F4 REAL
F8 DOUBLE PRECISION
I2 SMALLINT
I4 INT
Nnn.m NUMERIC (nn+m,m)
Pnn.m NUMERIC (nn+m,m)
T, A8 TIME
T (COMPOPT DB2TSTI=ON) TIMESTAMP
D, A10 DATE
A26 TIMESTAMP
A19 TIMESTAMP(0)
A20+n TIMESTAMP(n) (1<=n<=12)
A25 TIMESTAMP(0) WITH TIMEZONE
A26+n TIMESTAMP(n) WITH TIMEZONE (1<=n<=12)
Gn; nur für View-Felder GRAPHIC (n)
Un, U DYNAMIC GRAPHIC (n) ,VARGRAPHIC(n), DBCLOB(n) CCSID 1200
Bn, B DYNAMIC BINARY(n), VARBINARY(n), BLOB(n)
P19.0 BIGINT
F8 DECFLOAT(n)
A DYNAMIC, B DYNAMIC, U DYNAMIC XML
Gruppenstruktur (I4,I4,I4,A255) prefixed with :BLOBFILE: BLOB-Datei-Referenz
Gruppenstruktur (I4,I4,I4,A255) prefixed with :CLOBFILE: CLOB-Datei-Referenz
Gruppenstruktur (I4,I4,I4,A255) prefixed with :DBCLOBFILE: DBCLOB-Datei-Referenz
I4 mit Präfix :BLOBLOC: BLOB-Lokator
I4 mit Präfix :CLOBLOC: CLOB-Lokator
I4 mit Präfix :DBCLOBLOC: DBCLOB-Lokator

Natural überprüft nicht, ob der konvertierte SQL-Datentyp mit der Datenbankspalte kompatibel ist. Außer bei Feldern mit Format N wird keine Datenkonvertierung vorgenommen.

Bei Natural SQL gibt es zu den Standard-Natural-Formaten noch folgende Erweiterungen:

  • Um alphanumerische Spalten zu unterstützen, die länger als 253 Bytes sind, kann ein eindimensionales Array vom Format A verwendet werden. Der Index dieses Arrays muss mit 1 anfangen und kann nur mit einem Stern (*) referenziert werden. Der entsprechende SQL-Datentyp ist CHAR (n), wobei n die Gesamtanzahl der Bytes im Array ist.

  • Um Spalten mit variabler Länge zu unterstützen, kann eine host-variable mit Schlüsselwort LINDICATOR verwendet werden. Der entsprechende SQL-Datentyp ist VARCHAR (n); vgl. LINDICATOR-Klausel.

  • Die Natural-Formate Datum (D) und Zeit (T) können bei Natural for DB2 verwendet werden. Sie werden in die entsprechenden datenbank-spezifischen Formate DB2 DATE und TIME umgesetzt.

Ein sendendes Feld, das als eindimensionales Array ohne LINDICATOR-Feld angegeben wird, wird in den SQL-Datentyp VARCHAR umgesetzt. Seine Länge ist die Gesamtanzahl der Bytes des Arrays ohne Berücksichtigung nachgestellter Leerzeichen.