Flexible SQL

#### Search Results

Search

# Flexible SQL

Eine weitere Möglichkeit, SQL-Statements einzusetzen, ist die Verwendung so genannter "flexibler SQL". Diese gestattet Ihnen die Verwendung beliebiger SQL-Syntax.

Dieses Dokument behandelt folgende Themen:

- Flexible SQL benutzen

- Textvariablen in flexibler SQL angeben

## Flexible SQL benutzen

Zusätzlich zu der im bisherigen Verlauf dieses Kapitels beschriebenen SQL-Syntax haben Sie mit flexibler SQL die Möglichkeit, beliebige SQL-Syntax zu verwenden.

#### Die Zeichen `<<` und `>>`

Flexible SQL muss zwischen den Zeichen `<<` und `>>` stehen. Sie kann beliebigen SQL-Text und `host-variables` enthalten. Mit flexibler SQL verwendete `host-variables` müssen als Präfix einen Doppelpunkt (:) haben.

Fexible SQL kann aus einer Zeichenkette bestehen, die über mehrere Zeilen gehen und ganze oder teilweise Kommentarzeilen enthalten kann (vgl. `PROCESS SQL`-Statement).

Flexible SQL kann anstelle folgender SQL-Syntaxteile verwendet werden:

- `atom`

- `column-reference`

- `scalar-expression`

- `predicate`

Flexible SQL kann auch zwischen den Klauseln eines `select-expression` verwendet werden:

    SELECT selection
      << ... >>
      INTO ...
      FROM ...
      << ... >>
      WHERE ...
      << ... >>
      GROUP BY ...
      << ... >>
      HAVING ...
      << ... >>
      ORDER BY ...
      << ... >>

Anmerkung
Der in flexibler SQL angegebene SQL-Text wird nicht vom Natural-Compiler erkannt, sondern (mit ausgetauschten `host-variables`) einfach in die SQL-Zeichenkette kopiert, die an das Datenbanksystem übergeben wird. Demzufolge werden Syntaxfehler in der flexiblen SQL erst zur Laufzeit erkannt, wenn die Datenbank das betreffende Statement ausführt.

#### Beispiel 1

    SELECT NAME
    FROM SQL-EMPLOYEES
    WHERE << MONTH (BIRTH) >>  =  << MONTH (CURRENT_DATE) >>

#### Beispiel 2:

    SELECT NAME
    FROM SQL-EMPLOYEES
    WHERE << MONTH (BIRTH) = MONTH (CURRENT_DATE) >>

#### Beispiel 3:

    SELECT NAME
    FROM SQL-EMPLOYEES
    WHERE SALARY > 50000
    << INTERSECT
       SELECT NAME
       FROM SQL-EMPLOYEES
       WHERE DEPT = 'DEPT10'
    >>

## Textvariablen in flexibler SQL angeben

Innerhalb der flexiblen SQL können Sie auch so genannte "Textvariablen" angeben.

<<:`T`:host-variable [`LINDICATOR`:host-variable]>>

Die Syntax-Elemente sind im Folgenden beschrieben.

`:T:` | Eine Textvariable ist eine `host-variable` mit dem Präfix `:T:`. Sie muss alphanumerisches Format haben. Zur Laufzeit wird eine Textvariable innerhalb eines SQL-Statements durch ihren Inhalt ersetzt, d.h. die in der Textvariablen enthaltene Textzeichenkette wird in die SQL-Zeichenkette eingefügt. Nach dem Ersetzen werden nachfolgende Leerzeichen aus der eingefügten Textzeichenkette entfernt. Sie müssen selbst darauf achten, dass sich aus dem Inhalt einer Textvariablen beim Einfügen ein syntaktisch korrektes SQL-Statement ergibt. Insbesondere darf eine Textvariable keine `host-variables` enthalten. Ein Statement, das eine Textvariable enthält, wird immer im dynamischen SQL-Modus ausgeführt.
`LINDICATOR` | LINDICATOR-Option: Nach der Textvariablen können Sie das Schlüsselwort `LINDICATOR` sowie eine Längenindikator-Variable (d.h. eine `host-variable` mit vorangestelltem Doppelpunkt) angeben. Die Längenindikator-Variable muss Format/Länge I2 haben. Wenn Sie keine `LINDICATOR`-Variable angeben, wird der gesamte Inhalt der Textvariablen in die SQL-Zeichenkette eingefügt. Wenn Sie eine `LINDICATOR`-Variable angeben, werden nur die ersten `n` Zeichen (wobei `n` der Wert der `LINDICATOR`-Variablen ist) des Textvariableninhalts in die SQL-Zeichenkette eingefügt. Falls die Zahl in der `LINDICATOR`-Variablen größer als die Länge des Textvariableninhalts ist, wird der gesamte Textvariableninhalt eingefügt. Falls die Zahl in der `LINDICATOR`-Variablen negativ oder Null (`0`) ist, wird nichts eingefügt. Siehe auch allgemeine Informationen zu `host-variable`.

#### Beispiel mit einer Textvariablen:

       DEFINE DATA LOCAL
       01 TEXTVAR (A200)
       01 TABLES VIEW OF SYSIBM-SYSTABLES
          02 NAME
          02 CREATOR
       END-DEFINE
       *
       MOVE 'WHERE NAME > ''SYS'' AND CREATOR = ''SYSIBM''' TO TEXTVAR
       *
       SELECT * INTO VIEW TABLES
         FROM SYSIBM-SYSTABLES
         << :T:TEXTVAR >>
         DISPLAY TABLES
       END-SELECT
       *
       END

Das generierte SQL-Statement (wie mit dem Systemkommando `LISTSQL` angezeigt) sieht wie folgt aus:

    SELECT NAME, CREATOR FROM SYSIBM.SYSTABLES:T: FOR FETCH ONLY

Das ausgeführte SQL-Statement sieht wie folgt aus:

    SELECT TABNAME, CREATOR FROM SYSIBM.SYSTABLES
      WHERE TABNAME > 'SYS' AND CREATOR = 'SYSIBM'

### On this page

- Flexible SQL benutzen
- Textvariablen in flexibler SQL angeben