Grundlegende Syntaxbestandteile

#### Search Results

Search

# 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

- Namen

- Parameter

- Include Columns-Klausel

- Period-Klausel

- Natural-Formate und SQL-Datentypen

## 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

- ddm-name

- view-name

- column-name

- location-name

- table-name

- correlation-name

### authorization-identifier

Ein `authorization-identifier`, der auch "creator name" genannt wird, dient zur Qualifizierung von Datenbanktabellen und Views (Datensichten). 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 (Datensicht).

### 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. der View (Datensicht) 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. einer View (Datensicht) 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 einer Natural-View (Datensicht) 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 einer View (Datensicht) 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` | Dient zur Angabe eines `built-in-type`-Datentyps. Beschreibung der `built-in-types` siehe IBM Db2 for z/OS-Dokumentation.
`distinct-type` | Dient zur Angabe eines `distinct-type`-Datentyps.

## 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, dass das `DELETE`- oder `UPDATE`-Statement nur für Zeilenwerte für den Teil des `BUSINESS_TIME`-Zeitraums 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. Wenn der Zeitraum, der durch den Startwert und den Endewert für die `BUSINESS_TIME` einer Zeile angegeben ist, vollständig in dem angegebenen Zeitraum enthalten ist (wenn 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. Wenn der Zeitraum, der durch den Startwert und den Endewert für die `BUSINESS_TIME` einer Zeile angegeben ist, nur teilweise in dem angegebenen Zeitraum enthalten ist (wenn der Startwert für den Zeitraum in der Zeile größer als `expr2` oder der Endewert für den Zeitraum in der Zeile kleiner als `expr1` ist), wird diese Zeile aktualisiert oder gelöscht, und anschließend werden eine oder zwei zusätzliche Zeilen eingefügt. Die eingefügten Zeilen stellen die ursprünglichen Zeilenwerte für die Zeiträume dar, die durch den Aktualisierungsvorgang nicht aktualisiert oder gelöscht wurden. Für die eingefügten Zeilen werden der Startwert und der Endewert für die `BUSINESS_TIME` so gesetzt, dass entweder der Startwert für die `BUSINESS_TIME` der Startwert für die `BUSINESS_TIME` der ursprünglichen Zeile und der Endewert expr1 ist, oder der Startwert ist `expr2` und der Endewert ist der Endewert für die `BUSINESS_TIME` der ursprünglichen Zeile.
`expr1` and `expr2` | Geben Sie Ausdrücke an, die einen Wert eines `built-in`-Datentyps zurückliefern. Das Ergebnis eines jeden Ausdrucks muss mit dem Datentyp der Spalten des angegebenen Zeitraums vergleichbar sein. Ein 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.

### On this page

- Konstanten
- Namen
- Parameter
- Include Columns-Klausel
- Period-Klausel
- Natural-Formate und SQL-Datentypen