SQLScript Grundlagen

Syntax Grundlagen der Sprache SQLScript

(C) Brandeis Consulting.

Syntax Grundlagen der Sprache SQLScript

  • Anweisungen
  • Whitespace
  • Kommentare
  • Literale
  • Bezeichner
  • Lokale Variablen und Parameter
  • Operatoren
  • Ausdrücke
  • NULL
  • DUMMY
(C) Brandeis Consulting.

Anweisungen

Die Sprache SQLScript besteht aus Anweisungen. Eine Anweisung beginnt, außer bei Zuweisungen, mit einem Schlüsselwort und endet mit einem Semikolon.

DECLARE lv_var INT;
SELECT count(*) INTO lv_var FROM aufgaben ; 
lv_var = 1;
(C) Brandeis Consulting.

Verschachtelte Anweisungen

Manche Anweisungen könne selber wieder Anweisungen enthalten. So bildet beispielsweise eine IF-Anweisung eine Klammer um einen oder mehrere Anweisungsblöcke (Dazu später mehr).

1  IF lv_counter > 0 
2  THEN 
3     INSERT INTO farben VALUES ('Violett');
4  END IF;

In dem Listing beginnt die IF-Anweisung in Zeile 1 und endet mit dem Semikolon in Zeile 4.
Die INSERT-Anweisung beginnt und endet in Zeile 3.

(C) Brandeis Consulting.

Whitespace

In SQLScript ist Whitespace nur dort erforderlich, wo eine eindeutige Trennung aufeinanderfolgender Schüsselwörter, Felder, Variablen usw. sonst nicht möglich wäre. Er darf aber auch überall sonst zwischen den einzelnen Sprachelementen eingefügt werden.

Whitespace ist in erster Linie für eine bessere Lesbarkeit hilfreich

(C) Brandeis Consulting.

Kommentare

Kommentare sind Bestandteile des Quelltextes, die von System vollständig ignoriert werden. Der Inhalt eines Kommentars dient also nur dem menschlichen Leser zum Verständnis des Codes. SQLScript unterscheidet zwei Varianten von Kommentaren: Zeilenendkommentare und Blockkommentare.

(C) Brandeis Consulting.

Blockkommentare

Blockkommentare beginnen mit den beiden Zeichen Schrägstrich und Stern und Enden mit Stern und Schrägstrich:

SELECT /* Das ist ein Blockkommentar */ id FROM TASKS;

SELECT /* id,
          title,
          due_date, */
          assignee, 
          effort
  FROM tasks;

Blockkommentare können über mehrere Zeilen gehen. Sie können auch mitten in einer Zeile beginnen.

(C) Brandeis Consulting.

Zeilenendkommentare

Ein Zeilenendkommentar beginnt mit einem doppelten Bindestrich. Alles was danach bis zum Ende der Zeile geschrieben steht, wird nicht als Anweisung interpretiert. Vor dem Zeilenendkommentar können Teile von Anweisungen stehen.

SELECT COUNT(*) 
INTO lv_var    --Zeilenendkommentar
FROM aufgaben ; 
(C) Brandeis Consulting.

ABAP Kommentare

In AMDP Prozeduren und Funktionen können auch die ABAP Zeilenkommentare verwendet werden. Diese beginnen mit einem * an der ersten Stelle einer Zeile.

* SELECT COUNT(*) 
* INTO lv_var    
* FROM aufgaben ; 

Bitte vermeidet diese ABAP Kommentare, da der AMDP Code sonst nicht mehr in die SQL-Konsole kopiert werden kann!

ABAP Zeilenendkommentare mit Gänsefüßchen " können nicht verwendet werden. Dieses Zeichen leitet immer den Anfang eines Bezeichners in spezieller Notation ein.

(C) Brandeis Consulting.

Literale

Literale repräsentieren konstante Werte im Quellcode, der direkt eingegeben wird. Dieser kann an unterschiedlichen Stellen verwendet werden, wie zum Beispiel in Zuweisungen, als Feldwert oder als Vergleichswert in einer Bedingung.

Datentypen von Literalen

Bezeichnung Format Beispiel
Zeichenketten In Hochkomma 'Peter'
Ganzzahlen Ziffernfolge 123
Dezimalzahlen Ziffernfolge mit Dezimalpunkt 123.456
Datum Präfix DATE DATE'2017-11-10'
Uhrzeit Präfix TIME TIME'15:42:04'
Zeitstempel Präfix TIMESTAMP TIMESTAMP'2011-12-31 23:59:59.123'
NULL NULL-Wert
(C) Brandeis Consulting.

Warum sind die Datentypen von Literalen wichtig?

Weil die Werte sonst immer wieder in passenden Typ konvertiert werden müssen. Das geschieht meist implizit, kostet aber Laufzeit. Wo eine implizite Konvertierung nicht möglich ist, kommt es zu Fehlern.

--Schlecht:
SELECT DAYS_BETWEEN( CURRENT_DATE, '2000-01-01') FROM DUMMY

--Gut:
SELECT DAYS_BETWEEN( CURRENT_DATE, DATE'2000-01-01') FROM DUMMY

In BW-Transformationen werden Felder z.B. gerne mit '' geleert. Dadurch wird aber der Typ dieser Spalte als Zeichenkette festgelegt. Das führt bei Kennzahlen zu Fehlermeldungen.

SELECT plant,
       material,
       '' as recordmode,
       0  as amount,
      ...
  FROM ...
(C) Brandeis Consulting.

Bezeichner

Bezeichner sind Namen für Objekte in der HANA wie zum Beispiel für Tabellen, Views und Spalten. Diese Bezeichner sind grundsätzlich case sensitiv. Dabei ist es wichtig, wie der Quelltext vom System interpretiert wird. Dabei gibt es zwei unterschiedliche Notationen:

  • Spezielle Notation
  • Einfache Notation

Beide Notationen können auch innerhalb einer Anweisung beliebig gemischt werden.

(C) Brandeis Consulting.

Spezielle Notation

In der speziellen Notation werden die Bezeichner in Gänsefüßchen eingerahmt. Dabei sind alle Unicodezeichen an jeder Position erlaubt. Das bedeutet, dass auch Leerzeichen, Sonderzeichen wie zum Beispiel Punkt und Komma als auch alle anderen Zeichen erlaubt sind.

SELECT "ID",                  -- ID
       "/BIC/BMERRCODE",      -- /BIC/BMERRCODE
       "Titel"                -- Titel
       FROM "Meine Tabelle";  -- Meine Tabelle
(C) Brandeis Consulting.

Einfache Notation

In der einfachen Notation werden die Bezeichner im Quelltext nicht in Gänsefüßchen angegeben. Damit wird er intern automatisch in Großbuchstaben konvertiert. Außerdem gelten dann für Ihn die folgenden Einschränkungen:

  • Er muss mit einem Buchstaben oder einem Unterstrich beginnen
  • Er darf nur aus den folgenden Zeichen bestehen:
    • Buchstaben A-Z des lateinischen Alphabets, keine Umlaute
    • Ziffern 0-9
    • Unterstrich _
    • Dollar-Zeichen $
    • Doppelkreuz #
SELECT id,             --ID
       status,         --STATUS
       titel           --TITEL
       FROM aufgaben;  --AUFGABEN
(C) Brandeis Consulting.

Bezeichner im BW

Alle Bezeichner (Tabellennamen und Spaltennamen) im DDic sind in Großbuchstaben. Darum bietet sich eigentlich die einfach Notation an.

Aber für alle Feld- und Tabellenamen mit den Namensraum-Präfixen /BIC/ und /BI0/ ist die spezielle Notation notwendig.


tmp = SELECT calday, 
             plant,
             "/BIC/PFLX",
             "/BIC/PFOXL"
        FROM "/BIC/ADTSA0012";

Für alle selber vergebenen Namen, insbesondere innerhalb des Quelltextes, sollte nach Möglichkeit nur die einfache Notation verwendet werden.

(C) Brandeis Consulting.

SAP DWC bzw. DataSphere

In den unterschiedlichen Editoren der Data Warehouse Cloud wird die Notation unterschiedlich gehandhabt. Teilweise werden hier nachträglich Gänsefüsschen hinzugefügt.

Bei Fehlersituationen ist es ist hilfreich, sich den generierten Code anzusehen. Dort gelten die zuvor beschriebenen Notationen.

(C) Brandeis Consulting.

Lokale Variablen

In SQLScript kann man auf lokale Tabellenvariablen und Tabellenparameter genauso mit einer SELECT-Anweisung zugreifen wie auf Datenbanktabellen. Somit ist bei lesendem Zugriff eine Unterscheidung notwendig, damit der Quellcode eindeutig bleibt. Hierfür wird ein Doppelpunkt vor die entsprechende Variable gesetzt.

CREATE PROCEDURE get_name(IN iv_id INT)
AS BEGIN

   tmp = SELECT id, 
                lastname, 
                firstname 
           FROM users;

   SELECT * 
     FROM :tmp 
    WHERE id = :iv_id; 
END;

Der Doppelpunkt bei Tabelenvariablen ist nur nötig und erlaubt, wenn eine Verwechslungsgefahr mit Datenbankobjekten besteht.

(C) Brandeis Consulting.

Operatoren

Operatoren berechnen ein Ergebnis aus den Operanden. Beispielsweise kann man zwei Zahlen mit dem Plus (+) Operator zu Ihrer Summe verknüpfen.

Arithmetische Operatoren

liefern ein numerisches Ergebnis.

  • Addition: +
  • Subtraktion: -
  • Multiplikation: *
  • Division : /
  • Negation: - als Vorzeichen

Zeichenkettenoperatoren

  • Verketten von Zeichenketten zu einer neuen Zeichenkette: ||

Vergleichsoperatoren

  • Gleich =
  • Ungleich != oder <>
  • Kleiner als <
  • Größer als >
  • Größer/gleich >=
  • Kleiner/gleich <=

Logische Operatoren

  • AND
  • OR
  • NOT - aus TRUE wird FALSE.
(C) Brandeis Consulting.

Auswertungsreihenfolge der Operatoren

Auswertungsreihenfolge der Operatoren von oben nach unten:

Gruppe Operatoren
Klammern
Arithmetische Operatoren Vorzeichen
Multiplikation und Division
Addition und Subtraktion
String Operatoren Verkettung
Vergleichsoperatoren Alle
Logische Operatoren NOT
AND
OR
(C) Brandeis Consulting.

Ausdrücke…

  • sind ist ein Sprachkonstrukt, das in seinem Kontext ausgewertet wird und dabei einen Wert zurückgibt
  • können an unterschiedlichen Stellen einer SQL-Anweisung verwendet werden
  • können Ausdrücke enthalten
  • können als Ergebnis einen skalaren Wert oder eine Tabelle haben

Also alles, was bei einer Zuweisung rechts stehen kann, ist ein Ausdruck!
Variable = <Ausdruck>

(C) Brandeis Consulting.

Skalare Werte vs. Tabellen

Skalare Werte speichern genau einen Wert, z.B. eine Zahl oder ein Datum.

Tabellen enthalten Zeilen und Spalten. Auch das Ergebnis einer SELECT-Abfrage, die genau eine Zeile und eine Spalte liefert, ist eine Tabelle. Diese Abfragen werden skalare Abfragen genannt.

Verwendung einer skalaren Abfrage als Vergleichswert

select * 
  from tasks
  where due_date = ( select max(due_date) from tasks )
(C) Brandeis Consulting.

Welche skalaren Ausdrücke gibt es?

  • Literale
  • Variablennamen
  • Spaltennamen
  • Funktionsaufrufe
    • SQL-Funktionen - z.B. SUBSTRING()
    • Aggregatfunktionen - z.B. MAX()
    • User Defined Functions (UDF)
  • Operatorausdrücke - Verknüpfung von Ausdrücken mit Operatoren
  • CASE-Ausdruck
  • (Korrelierte-) Unterabfragen
(C) Brandeis Consulting.

Ein Beispiel für unterschiedliche Ausdrücke

SELECT 
--     Feldname als Ausdruck
       id,
--     Verkettungsoperation als Ausdruck
       firstname || ' ' || lastname AS name,
--     CASE-Ausdruck..
       CASE sex
--               ..mit Funktionsaufruf als Ausdruck
          WHEN 'F' THEN NCHAR(9792)
          WHEN 'M' THEN NCHAR(9794)
          ELSE '' 
       END 
          AS MW,
--     Funktionsaufruf als Ausdruck  
       COALESCE(team, 0) as team
   FROM users;

(C) Brandeis Consulting.

Wo kann man Ausdrücke verwenden?

An allen Stellen wo ein Wert benötigt wird, kann man Ausdrücke verwenden.

Beispiel

SELECT *
  FROM tasks
 WHERE SUBSTRING(title, 3, 1) = 'a';
(C) Brandeis Consulting.

Tabellenausdrücke

Tabellenausdrücke können in der FROM Klausel verwendet werden.

SELECT ... 
  FROM <Tabellenausdruck>

Liste der Tabellenausdrücke

  • Namen von Datenbanktabellen oder -views
  • Tabellen-Funktionen
  • Lokale Tabellenvariablen
  • Unterabfragen
SELECT avg(id) FROM (SELECT id FROM aufgaben
                     UNION
                     SELECT id FROM benutzer )
(C) Brandeis Consulting.

Prädikate

Ein Prädikat ist ein Ausdruck, der zu TRUE, FALSE oder UNKNOWN aufgelöst wird. Beispielsweise:

  • Vergleich mit Vergleichsoperator (<, =, >, ….)
  • LIKE
  • BETWEEN
  • IS NULL
  • EXISTS
  • IN
(C) Brandeis Consulting.

NULL

Bei NULL handelt es sich nicht um einen konkreten Wert, sondern um das Fehlen eines Wertes. Insbesondere handelt es sich nicht um einen gültigen Initialwert wie zum Beispiel 0 oder SPACE.

NULL wird in der Datenvorschau entweder als NULL oder als Fragezeichen dargestellt.

Mit NULL kann nie sinnvoll verglichen werden.
Das Ergebnis ist immer UNKNOWN !

(C) Brandeis Consulting.

Ein Beispiel für NULL

CREATE TABLE test_null( id   INT,
                        name VARCHAR(10) );
INSERT INTO test_null VALUES(1, 'Peter');
INSERT INTO test_null VALUES(2, 'Paul');
INSERT INTO test_null VALUES(3, 'Petra');
INSERT INTO test_null VALUES(4, 'Andrea');
INSERT INTO test_null(id) VALUES(5);

SELECT id, name FROM test_null;
SELECT id, name as "LIKE P%" FROM test_null WHERE name LIKE 'P%';


(C) Brandeis Consulting.

Übungsaufgabe

  • Zeige alle Zeilen an
    • SELECT id, name FROM test_null;
  • Finde alle Zeilen, wo der Name mit P anfängt
    • SELECT id, name as "LIKE P%" FROM test_null WHERE name LIKE 'P%';
  • Finde alle Zeilen, wo der Name nicht mit P anfängt
    • SELECT id, name as "NOT LIKE P%" FROM test_null WHERE name NOT LIKE 'P%';
      Zeile mit NULL wird nicht gefunden. ;-(
    • SELECT id, name as "= NULL" FROM test_null WHERE name = NULL;
      Findet überhaupt nichts, weil der Vergleich mit NULL immer UNKNOWN erzeugt.
    • SELECT id, name as "IS NULL" FROM test_null WHERE name IS NULL;
      Nur mit dem IS NULL Prädikat gelingt die Selektion der Zeile!
(C) Brandeis Consulting.

NULL im BW

In Transformationsroutinen darf in der Ausgabetabelle der Wert eines Merkmals nicht NULL sein!

(C) Brandeis Consulting.

Rechnen mit NULL

NULL ist nicht definiert. Also ist auch das Ergebnis einer Berechnung mit NULL auch nicht definiert.
Ein NULL-Wert kann komplexe Ausdrücke infizieren, so dass das Endergebnis auch NULL ist.

Einfache Beispiele

NULL + 5 = NULL
NULL || 'ABC' = NULL
(C) Brandeis Consulting.

NULL in Prädikaten

Über NULL lässt sich keine logische Aussage treffen. Die Bedingung
WHERE col1 = NULL;
ist niemals erfüllt.

IS NULL

Nur dieses Prädikat kann NULL ausfiltern!

(C) Brandeis Consulting.

NULL abfangen

Mit Funktionen NULL-Werte ersezten:

  • IFNULL( <Wert1>, <Wert2>)
  • COALESCE( <Wert1>, <Wert2>, ..., <WertN>)
(C) Brandeis Consulting.

Die Tabelle DUMMY

In jedem SAP HANA System existiert eine Tabelle mit Namen DUMMY. Diese hat eine Spalte mit dem Namen DUMMY und enthält genau eine Zeile mit dem Wert X. Der Inhalt von DUMMY kann nicht geändert werden.

Die Tabelle DUMMY ist sehr hilfreich beim Test von Ausdrücken oder zum Erzeugen von leeren Tabellen mit einer festen Struktur.

(C) Brandeis Consulting.

Beispiele für die Verwendung von DUMMY

Test eines Ausdrucks:

select substring('ABCDEFG', 3, 2) FrOM DUMMY;

Erstellen einer leeren Tabelle mit zwei Spalten:

errorTab =  SELECT '' AS ERROR_TEXT,
                   '' AS SQL__PROCEDURE__SOURCE__RECORD
              FROM DUMMY 
              WHERE DUMMY = 'Y';

(C) Brandeis Consulting.

Weiteres Beispiel…

lt_fiscper3 = SELECT '001' AS fiscper3 FROM DUMMY UNION ALL
              SELECT '002' AS fiscper3 FROM DUMMY UNION ALL
              SELECT '003' AS fiscper3 FROM DUMMY UNION ALL
              SELECT '004' AS fiscper3 FROM DUMMY UNION ALL
              SELECT '005' AS fiscper3 FROM DUMMY UNION ALL
              SELECT '006' AS fiscper3 FROM DUMMY UNION ALL
              SELECT '007' AS fiscper3 FROM DUMMY UNION ALL
              SELECT '008' AS fiscper3 FROM DUMMY UNION ALL
              SELECT '009' AS fiscper3 FROM DUMMY UNION ALL
              SELECT '010' AS fiscper3 FROM DUMMY UNION ALL
              SELECT '011' AS fiscper3 FROM DUMMY UNION ALL
              SELECT '012' AS fiscper3 FROM DUMMY UNION ALL
              SELECT '013' AS fiscper3 FROM DUMMY UNION ALL
              SELECT '014' AS fiscper3 FROM DUMMY UNION ALL
              SELECT '015' AS fiscper3 FROM DUMMY UNION ALL
              SELECT '016' AS fiscper3 FROM DUMMY ;

(C) Brandeis Consulting.