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

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:

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'