View
11
Download
1
Category
Preview:
Citation preview
53
2
Kapitel 2
Die ersten Schritte mit SQLScript
In diesem Kapitel vermittle ich Ihnen die sprachlichen Grundlagen von
SQLScript. Hierbei geht es zunächst um einige wichtige formale Aspekte der
Programmiersprache. Danach lernen Sie das Anlegen und Aufrufen von
Prozeduren und benutzerdefinierten Funktionen kennen.
In diesem Kapitel geht es mit SQLScript richtig los. Zunächst wird die Frage
geklärt, was SQLScript eigentlich für eine Sprache ist. Danach geht es in Ab-
schnitt 2.2 weiter mit dem formalen Teil der Sprache SQLScript. Die Grund-
lage jeder Programmiersprache bilden die lexikalischen Elemente. So
werden die kleinsten Spracheinheiten bezeichnet, aus denen sich ein Pro-
gramm zusammensetzt. Dazu gehören z. B. Kommentare, Bezeichner, An-
weisungen, Ausdrücke und Literale. Diese lexikalischen Elemente müssen
gewissen formalen Kriterien entsprechen, damit sie vom System korrekt
erkannt werden.
Dann geht es um zwei unterschiedliche Konzepte von »Nichts«. Der Wert
NULL repräsentiert in Datenbankfeldern die Abwesenheit eines konkreten
Werts. Damit verhält er sich anders, als man es naiv erwarten könnte. Gera-
de für ABAP-Entwickler ist das eine beliebte Stolperfalle, da sie bislang NULL
(fast) nicht beachten mussten. Ein anderes erklärungsbedürftiges Konzept
ist eine Tabelle namens DUMMY, die mit nur genau einer Spalte gleichen Na-
mens genau einen Datensatz enthält. Trotzdem ist sie in manchen Fällen
extrem nützlich.
In Abschnitt 2.3 geht es um die logischen Container. Diese bilden einen Rah-
men für SQLScript-Anweisungen. Dazu gehören z. B. Prozeduren, Funktio-
nen und anonymen Blöcke.
Das Kapitel wird in Abschnitt 2.4 mit einem kompletten Beispiel abgerun-
det, an dem Sie die gelernten Punkte noch einmal nachvollziehen können.
Die Beispiele in diesem Kapitel zeigen teilweise SQLScript-Anweisungen,
die erst in späteren Kapiteln im Detail erklärt werden. Wenn Sie aber Erfah-
rungen mit anderen Programmiersprachen haben, können Sie diese leicht
nachvollziehen. Der für das Beispiel relevante Aspekt ist jeweils fett hervor-
gehoben.
6208.book Seite 53 Mittwoch, 5. September 2018 1:04 13
2 Die ersten Schritte mit SQLScript
54
2.1 SQL vs. SQLScript
SQL ist eine Datenbanksprache zur Definition von Datenstrukturen in
relationalen Datenbanken sowie zum Bearbeiten (Einfügen, Verändern,
Löschen) und Abfragen von darauf basierenden Datenbeständen.
(Wikipedia, https://de.wikipedia.org/wiki/SQL, [27.10.2017])
Anwendungen nutzen die Sprache SQL, um mit der Datenbank zu kommu-
nizieren. Dabei werden immer einzelne Anweisungen nacheinander an die
Datenbank gesendet. In SQL gibt es keine Möglichkeit, mehrere Anweisun-
gen zu verknüpfen oder eine Ablauflogik zu definieren.
Erweiterung des
SQL-Standards
Viele Datenbankhersteller haben deswegen den SQL-Standard für ihre Pro-
dukte um diese Funktionen erweitert. So haben z. B. Oracle die Sprache
PL/SQL und IBM die Sprache SQL PL entwickelt. Das Kürzel PL steht in bei-
den Fällen für »Procedural Language«. Bei diesen Sprachen können Blöcke
von Anweisungen als Funktion oder Prozedur gespeichert und immer wie-
der ausgeführt werden. Bei SQLScript handelt es sich ebenfalls um eine sol-
che Erweiterung des ANSI SQL-Standards, den SAP für die Datenbank SAP
HANA definiert hat.
Auch ASE spricht SQLScript
SQLScript wird fast ausschließlich als Programmiersprache für die SAP-
HANA-Datenbank wahrgenommen und auch so vermarktet. Dabei hat SAP
mit der Firmentochter Sybase eine weitere Datenbank im Portfolio, die
auch SQLScript versteht: Adaptive Server Enterprise (ASE)
Die SQLScript-Anweisungen und SQL-Funktionen auf ASE sind mit SAP
HANA 1.0 SPS12-kompatibel. Weitergehende Informationen finden Sie in
dem SAP-Dokument »SAP ASE SQLScript Reference«.
Die Erweiterungen des SQL-Standards durch SQLScript betreffen unter an-
derem die folgenden Bereiche:
� Prozeduren, Funktionen und anonyme Blöcke als logische Container für
den SQLScript-Code
� Erweiterung der Datentypen um Tabellentypen ohne zugehörige Daten-
banktabelle
� Deklarative Logik zur Formulierung komplexer, aber trotzdem sehr per-
formanter Datenbankabfragen
� Imperative Logik zur Ablaufsteuerung wie z. B. IF/ELSE oder FOR-Schleifen
6208.book Seite 54 Mittwoch, 5. September 2018 1:04 13
2.1 SQL vs. SQLScript
55
2
Es handelt sich bei SQLScript also um eine Erweiterung des SQL-Standards.
Das bedeutet, dass SQL-Anweisungen direkt im SQLScript-Code eingebettet
sind. Sie bilden gemeinsam eine Sprache. Deswegen beschränkt sich dieses
Buch auch nicht darauf, nur diese Erweiterungen zu besprechen, sondern
betrachtet SQLScript als eine Einheit.
Kategorien von
SQL-Anweisungen
Traditionell werden die SQL-Anweisungen in die drei Kategorien Data
Manipulation Language (DML), Data Definition Language (DDL) und Data
Control Language (DCL) eingeteilt.
� DML: DML umfasst alle Anweisungen, die den Datenbestand in den Da-
tenbanktabellen lesen oder ändern. Die meisten Anwendungen verwen-
den im laufenden Betrieb ausschließlich DML-Anweisungen. Typische
Anweisungen sind SELECT, INSERT und UPDATE. Der lesende Zugriff
mittels DML wird in Kapitel 3 beschrieben, der ändernde Zugriff in
Kapitel 5.
� DDL: Die Definition des Datenmodells erfolgt mit diesen Anweisungen.
Das geschieht normalerweise während der Entwicklung oder zum Instal-
lations- bzw. Upgrade-Zeitpunkt einer Anwendung. Typische Anweisun-
gen sind die CREATE-, ALTER- und DROP-Anweisungen. Sie werden in
Kapitel 7 ausführlich besprochen.
� DCL: Dieser Teil der SQL-Sprache ist für die Vergabe von Schreib- und
Leseberechtigungen zuständig. Die Anweisungen sind also für die Admi-
nistration der Datenbank relevant. Typische Anweisungen sind GRANT
und REVOKE. DCL wird in diesem Buch nicht weiter besprochen. Infor-
mationen zur Administration der SAP-HANA-Datenbank mit SQL finden
Sie im SAP-Dokument »SAP HANA SQL and System Views Reference«.
In Abbildung 2.1 sehen Sie eine Übersicht über die Sprache SQLScript mit
dem SQL-Standard und den Erweiterungen von SAP.
Code-to-Data-
Paradigma
Durch das Anlegen von wiederausführbaren Prozeduren und Funktionen
ist es möglich, auch größere Aufgaben, die über die Ausführung einer ein-
zelnen SQL-Anweisung hinaus gehen, an die Datenbank zu delegieren.
Diese Technik wird von SAP das Code-to-Data-Paradigma genannt. Es be-
sagt, dass komplexe und datenintensive Berechnungen direkt in der Daten-
bank durchgeführt werden sollen. Damit spart man sich die Kosten für das
Kopieren der Daten auf den Anwendungsserver und kann ggf. noch von der
Parallelisierung und weiteren Optimierungen von SAP HANA profitieren.
Dies wird erst durch die Erweiterungen in der Sprache SQLScript ermög-
licht, da sich mit reinem SQL immer nur einzelne Anweisungen absetzen
lassen. Abbildung 2.2 zeigt die Unterschiede zwischen der klassischen Drei-
Schichten-Architektur und dem Code-to-Data-Paradigma.
6208.book Seite 55 Mittwoch, 5. September 2018 1:04 13
2 Die ersten Schritte mit SQLScript
56
Abbildung 2.1 Typische SQLScript-Anweisungen im Überblick
Abbildung 2.2 Vergleich zwischen der Drei-Schichten-Architektur und dem
Code-to-Data-Paradigma
Gerade wenn sich die Probleme mit deklarativem Code lösen lassen, sind
erhebliche Geschwindigkeitsverbesserungen durch Code-Pushdown mög-
lich. Allerdings hat dieses Vorgehen auch Nachteile. Der Anwendungsent-
SQLScript
SQL-Standard
DROP TABLE
ALTER TABLE
CREATE TABLE
REVOKE
GRANTDCL
DML
SELECT
schreibender Zugriff
UPDATE
INSERT
DELETE
DDL
Prozeduren
FOR
WHILE
IF
Cursors
Tabellenvariablen
Erweiterungen von SAP imperativ
deklarativ
UDF-Funktionen
Klassische Drei-Schichten-Architektur
Code-to-Data-Paradigma
Benutzeroberfläche
Anwendungsschicht
Datenbankschicht
SAP GUI/Web-Anwendungen SAP GUI/Web-Anwendungen
Ablaufsteuerung
Berechnungslogik
Daten Berechnungslogik
Daten
Ablaufsteuerung
6208.book Seite 56 Mittwoch, 5. September 2018 1:04 13
2.2 Grundlegende Sprachelemente
57
2
wickler muss z. B. mehrere Programmiersprachen beherrschen, außerdem
erhöht der Wechsel der Sprache auch die Komplexität bei der Entwicklung
und Fehlersuche in der Anwendung. Außerdem ist die logische Trennung
zwischen Applikationsserver und Datenbankserver nicht mehr so sauber,
wie es nach der klassischen Drei-Schichten-Architektur sein sollte. Diese
Trennung von Präsentationsschicht, Anwendungsschicht und Datenbank-
schicht galt lange Zeit als eine wichtige Errungenschaft der Softwarearchi-
tektur. Die Trennung der unteren beiden Schichten war so scharf, dass man
SAP-Systeme auf unterschiedlichen Datenbanksystemen laufen lassen
konnte. Dies war für viele Kunden und Partner ein wichtiger Aspekt bei der
Entscheidung für diese Softwareplattform.
Diese saubere Trennung wird mit dem Code-to-Data-Paradigma aufgeho-
ben. Formal bestehen die drei Schichten weiterhin, da ein Applikationsser-
ver und ein Datenbankserver existieren. Aber die logische Trennung zwi-
schen den Systemen wird verwässert, da die Datenbank einen Teil der
Aufgaben des Anwendungsservers übernimmt.
DrittanbieterFür Drittanbieter von Produkten auf der SAP-NetWeaver-Plattform bringt
dieser Paradigmenwechsel erhebliche Nachteile. Wenn man sein Produkt
weiterhin für alle Datenbankplattformen offen halten möchte, kann man
von den Vorzügen der SAP-HANA-Datenbank nur begrenzt profitieren. Al-
ternativ könnte man sich für eine zweigleisige Entwicklung entscheiden,
die aber mit einem entsprechenden Mehraufwand verbunden ist.
2.2 Grundlegende Sprachelemente
Wahrscheinlich konnten Sie Ihre Muttersprache schon fließend und fehler-
frei sprechen, bevor Sie in der Grundschule das erste Mal etwas über Gram-
matik gelernt haben. Für das Erlernen von Fremdsprachen ist es aber sehr
hilfreich, sich mit den grundlegenden Regeln auseinander zu setzen, die für
diese Sprache gelten. Und das gilt genauso für Programmiersprachen.
Damit der Compiler unseren Quellcode auch richtig interpretieren kann,
müssen wir zuerst verstehen, wie die einzelnen Sprachelemente aufgebaut
sind. Der Quellcode von SQLScript wird im Unicode-Zeichensatz geschrie-
ben. Dabei handelt es sich um einen Zeichensatz, der die Zeichen von nahe-
zu allen Schriftkulturen abbildet. So können z. B. kyrillische, chinesische
oder auch koreanische Schriftzeichen für den Quelltext verwendet werden.
Zugunsten einer besseren Lesbarkeit und Wartbarkeit sollten Sie sich je-
doch unbedingt bei allen Bezeichnern auf die Zeichen des ASCII-Zeichen-
satzes ohne Umlaute beschränken.
6208.book Seite 57 Mittwoch, 5. September 2018 1:04 13
2 Die ersten Schritte mit SQLScript
58
2.2.1 Anweisungen
Die Sprache SQLScript besteht in erster Linie aus Anweisungen. Eine Anwei-
sung beginnt, außer bei Zuweisungen, mit einem Schlüsselwort und endet
mit einem Semikolon. In SQLScript gibt es unterschiedliche Anweisungs-
arten:
� SQL-Anweisungen wie z. B. INSERT, CREATE PROCEDURE oder COMMIT
� Zuweisungen durch Gleichheitszeichen oder mit der INTO-Klausel einer
SELECT-Abfrage (siehe Abschnitt 3.1.2 und Abschnitt 6.1.1)
� Schleifen mit FOR oder WHILE oder als Cursor (siehe Abschnitt 6.3 und
Abschnitt 6.4)
� Bedingte Verzweigungen mit IF (siehe Abschnitt 6.2)
� Prozeduraufrufe (siehe Abschnitt 2.3.2)
� Deklarationen von Variablen
Verschachtelte
Anweisungen
Manche Anweisungen könne selbst wieder Anweisungen enthalten. So bil-
det z. B. eine IF-Anweisung eine Klammer um einen oder mehrere Anwei-
sungsblöcke. Das Konzept der Blöcke werden Sie in Abschnitt 2.3.1 kennen
lernen.
1 IF lv_counter > 02 THEN3 INSERT INTO farben VALUES ('Violett');4 END IF;
Listing 2.1 IF-Anweisung enthält eine INSERT-Anweisung
In Listing 2.1 beginnt die IF-Anweisung in Zeile 1 und endet mit dem Semi-
kolon in Zeile 4. Die INSERT-Anweisung beginnt und endet in Zeile 3.
2.2.2 Whitespace
Als Whitespace bezeichnet man alle Zeichen im Quellcode, die als Leerflä-
chen in weiß dargestellt werden. Dazu gehören z. B. Leerzeichen, Tabulato-
ren und Zeilenumbrüche. Diese Zeichen haben in Programmiersprachen
unterschiedliche Aufgaben. In SQLScript ist Whitespace nur dort erforder-
lich, 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.
Interpretation Der Compiler unterscheidet nicht zwischen den unterschiedlichen White-
space-Zeichen. Ebenfalls unerheblich ist die Anzahl aufeinanderfolgender
Whitespace-Zeichen. Damit können Sie Whitespace auch zur Formatierung
6208.book Seite 58 Mittwoch, 5. September 2018 1:04 13
2.2 Grundlegende Sprachelemente
59
2
einsetzen, um z. B. die Lesbarkeit des Quelltexts durch Einrückungen zu
verbessern. Die Einrückungen haben, im Gegensatz zu einzelnen anderen
Programmiersprachen wie z. B. Python, keine Auswirkungen auf die Se-
mantik. Es ist nicht erforderlich, dass jede Anweisung in einer neuen Zeile
steht, auch wenn das den Code deutlich übersichtlicher macht.
Das Beispiel in Listing 2.2 zeigt zwei identische SELECT-Anweisungen. Die
unterschiedliche Formatierung spielt aber semantisch keine Rolle.
SELECT col1,col2 FROM T1;SELECT col1,
col2FROM T1 ;
Listing 2.2 Beispiel für unterschiedliche Formatierung
2.2.3 Kommentare
Kommentare sind Bestandteile des Quelltextes, die vom System vollstän-
dig 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 Blockkom-
mentare.
Zeilen-
endkommentare
Ein Zeilenendkommentar beginnt mit einem doppelten Bindestrich. Alles
was danach bis zum Ende der Zeile geschrieben steht, wird nicht als Anwei-
sung interpretiert. Vor dem Zeilenendkommentar können Teile von An-
weisungen stehen. Es kann eine Anweisung, die über mehrere Zeilen geht,
auch von einem Zeilenendkommentar unterbrochen werden.
BlockkommentareBlockkommentare beginnen mit den beiden Zeichen Schrägstrich und
Stern und enden mit Stern und Schrägstrich:
/* Das ist ein Blockkommentar */
Ein Blockkommentar kann auch über mehrere Zeilen gehen und mitten in
Anweisungen stecken. In Abbildung 2.3 sehen Sie ein paar Beispiele für die
Anwendung von Kommentaren in SQLScript.
Abbildung 2.3 Beispiele für (überflüssige) Kommentare im Quelltext
6208.book Seite 59 Mittwoch, 5. September 2018 1:04 13
2 Die ersten Schritte mit SQLScript
60
Kommentare sollten nicht das Offensichtliche im Quelltext beschreiben,
sondern dem Leser das Verständnis des Quellcodes erleichtern, z. B. durch:
� Hintergrundwissen
� Bezug zur Spezifikation
� Gliederung des Quelltextes
Vor diesem Hintergrund sind alle Kommentare in dem obigen Beispiel
überflüssig. Es soll nur zeigen, wo im Quelltext Kommentare möglich sind.
2.2.4 Literale
Literale repräsentieren konstante Werte im Quellcode, die direkt eingege-
ben werden. Literale können an unterschiedlichen Stellen verwendet wer-
den, wie z. B. in Zuweisungen, als Feldwert oder als Vergleichswert in einer
Bedingung. Die Literale können unterschiedliche Datentypen haben, die
sich aus ihrem Wert ableiten. Tabelle 2.1 zeigt Beispiele für verschiedene
Datentypen.
Für die numerischen Literale ist auch ein negatives Vorzeichen in Form
eines Minus-Zeichens vorab möglich.
Bezeichnung Format Beispiel
Einfache Zeichenketten In Hochkomma 'Peter'
Unicode Zeichenketten In Hochkomma, mit einem großen N
als Präfix
N'Jörg'
Binärzeichenketten In Hochkomma, mit X als Präfix X'FF'
Ganzzahlen Ziffernfolge 123
Dezimalzahlen Ziffernfolge mit Dezimalpunkt 123.456
Gleitkommazahlen Mantisse und Exponent, getrennt
durch ein großes E
123E2
Hexadezimalzahlen Präfix 0x 0xFF
Datum Präfix DATE DATE'2017-11-10'
Uhrzeit Präfix TIME TIME'15:42:04.123'
Zeitstempel Präfix TIMESTAMP TIMESTAMP'2011-12-31 23:59:59'
Tabelle 2.1 Literale der unterschiedlichen Datentypen
6208.book Seite 60 Mittwoch, 5. September 2018 1:04 13
2.2 Grundlegende Sprachelemente
61
2
In Listing 2.3 sehen Sie die unterschiedlichen Literale in einer einfachen
SELECT-Anweisung. Wenn Sie diese in der SQL-Konsole der WBDW oder in
der SAP Web IDE ausführen, können Sie neben der Spaltenüberschrift der
Ergebnistabelle jeweils ein Symbol für den Datentypen sehen.
SELECT 'Jörg' AS string,N'Jörg' AS unicode,x'fff' AS binary,-10 AS integer,- 1.2345 AS decimal,- 17.126E30 AS float,0xff AS hex,'2010-01-01' AS date_as_string,DATE'2017-11-10' AS date,'15:42:04.123' AS time_as_string,TIME'15:42:04.123' AS time,'2011-12-31 23:59:59' AS timestamp_string,TIMESTAMP'2011-12-31 23:59:59' AS timestamp
FROM dummy;
Listing 2.3 Beispiele für Literale im Quelltext
Zeichenketten-
literale
Das Ergebnis der Zeichenkettenliterale sehen Sie in Abbildung 2.4. Es kann
sein, dass die Umlaute in der Datenvorschau in den unterschiedlichen Ent-
wicklungsumgebungen unterschiedlich dargestellt werden, wenn Sie Nicht-
Unicode-Zeichenketten verwenden.
Abbildung 2.4 Ergebnis der Zeichenkettenliterale
Numerische LiteraleDie numerischen Literale sehen Sie in Abbildung 2.5. Links neben der Spal-
tenüberschrift findet man ein kleines Symbol für die dargestellten Datenty-
pen. Hier ist durchweg '12' zu erkennen, was für numerische Datentypen
steht. Sie können sehen, dass das Gleitkommaliteral in die wissenschaft-
liche Notation mit nur einer Vorkommastelle umgewandelt wurde. Das he-
xadezimale Literal wurde von 0xFF in die Zahl 255 umgewandelt.
Abbildung 2.5 Ergebnis der numerischen Literale
6208.book Seite 61 Mittwoch, 5. September 2018 1:04 13
2 Die ersten Schritte mit SQLScript
62
Zeit- und
Datumsliterale
Bei den Zeit- und Datumsliteralen wurde im Listing jeweils auch eine Zei-
chenkettendarstellung erzeugt. Diese lässt sich in der Ausgabe nicht von
der korrekten Darstellung von Datums- und Zeitwerten unterscheiden. Nur
anhand der Symbole für die Datentypen in der Kopfzeile der Spalten erken-
nen Sie die tatsächlich verwendeten Datentypen. Durch die Präfixe TIME,
DATE und TIMESTAMP wurden die Daten mit dem jeweils korrekten Datentyp
erzeugt.
Abbildung 2.6 Ergebnis der Zeit- und Datumsliterale
2.2.5 Bezeichner
Bezeichner sind Namen für Objekte in SAP HANA, z. B. für Tabellen, Views
und Spalten. Diese Bezeichner sind grundsätzlich case sensitive, das heißt,
es wird zwischen Groß- und Kleinschreibung unterschieden. Dabei ist es
wichtig, wie der Quelltext vom System interpretiert wird. Dabei gibt es zwei
unterschiedliche Notationen.
Einfache Notation
von Bezeichnern
In der einfachen Notation wird ein Bezeichner im Quelltext nicht in Gänse-
füßchen angegeben. Damit wird er intern automatisch in Großbuchstaben
konvertiert. Außerdem gelten dann für den Bezeichner die folgenden Ein-
schränkungen:
� Er muss mit einem Buchstaben oder einem Unterstrich beginnen.
� Er darf nur aus den folgenden Zeichen bestehen:
– Buchstaben des lateinischen Alphabets, keine Umlaute
– Ziffern
– Unterstrich _
– Dollar-Zeichen $
– Doppelkreuz #
Für die Namen von Parametern und Variablen ist nur diese einfache Nota-
tion zulässig.
SELECT id,status,titelFROM aufgaben;
Listing 2.4 Beispiel für die einfache Notation
6208.book Seite 62 Mittwoch, 5. September 2018 1:04 13
2.2 Grundlegende Sprachelemente
63
2
In Listing 2.4 sehen Sie ein einfaches Beispiel für die Verwendung der ein-
fachen Notation. Die Bezeichner werden intern als ID, STATUS, TITEL und
AUFGABEN interpretiert.
Spezielle Notation
von Bezeichnern
In der speziellen Notation werden die Bezeichner in Gänsefüßchen einge-
rahmt. Dabei sind alle Unicodezeichen an jeder Position erlaubt. Das bedeu-
tet, dass Leerzeichen, Sonderzeichen wie z. B. Punkt und Komma und auch
alle anderen Zeichen erlaubt sind.
Das folgende Beispiel zeigt eindrücklich, dass mit der speziellen Notation
die Inhalte zwischen den Gänsefüßchen exakt 1:1 als Bezeichner verwendet
werden.
CREATE TABLE id_with_space("ID" int, " ID" int , "ID " int);
Ungünstige Bezeichner erschweren die Lesbarkeit erheblich. Hier wird eine
Tabelle angelegt, deren Spalten sich nur durch die Position von Leerzeichen
unterscheiden. Das ist syntaktisch zwar erlaubt und lässt sich ohne Fehler
ausführen. Allerdings sehen Sie im Ergebnis in Abbildung 2.7 eine Tabelle,
deren Spaltennamen für das menschliche Auge nicht mehr auseinanderzu-
halten sind.
Abbildung 2.7 Resultierende Tabellendefinition
Verwenden Sie möglichst immer die einfache Notation
Dieses Beispiel zeigt, wie gefährlich die Verwendung von schlecht gewähl-
ten Bezeichnern ist. Deswegen empfehle ich Ihnen, für eigene Datenbank-
objekte, stets Großbuchstaben ohne Umlaute zu verwenden und auf Leer-
und Sonderzeichen zu verzichten. Am besten verwenden Sie immer die
einfache Notation, um Probleme zu vermeiden. Mit dieser sind mehrdeu-
tige Namen fast unmöglich.
Wenn wir auf existierende Tabellen zugreifen, haben wir aber nicht die
Wahl, welche Tabellen- und Spaltennamen wir verwenden möchten. In den
6208.book Seite 63 Mittwoch, 5. September 2018 1:04 13
2 Die ersten Schritte mit SQLScript
64
Demodaten des SHINE-Datenmodells von SAP finden sich u. a. Spaltenna-
men mit Punkt, wie z. B. "NAME.FIRSTNAME", die uns zur Verwendung der spe-
ziellen Notation für diese Spalten zwingen. Im Quelltext lässt sich die Ver-
wendung der einfachen und der speziellen Notation aber auch beliebig
kombinieren.
Bezeichner von generierten Datenbankobjekten des SAP BW
SAP Business Warehouse (BW) generiert die Datenbanktabellen für die Da-
tenmodelle in die sogenannten Generierungsnamensräume /BIC/ bzw.
/BI0/. Das bedeutet, dass jedes Datenbankobjekt mit diesem Präfix be-
ginnt. Auch manche Feldnamen haben diese Präfixe. Um in SQLScript da-
rauf zuzugreifen, ist die spezielle Notation mit Gänsefüßchen notwendig.
Hier ist aber wiederum zu beachten, dass dann alles in Großbuchstaben
angegeben werden muss. Beispiel für die Attributstabelle des InfoObject
0MAT_PLANT:
"SAPNPL"."/BI0/PMAT_PLANT"
2.2.6 Zugriff auf lokale Variablen und Parameter
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 entspre-
chende Variable gesetzt, wie in Listing 2.5 zu sehen.
CREATE PROCEDURE get_name(IN id INT)AS BEGIN
tmp = SELECT id, name, first_name FROM test;SELECT * FROM :tmp WHERE id = :id;
END;CALL get_name(1);
Listing 2.5 Zugriff auf lokale Felder und Parameter
Bei schreibendem Zugriff ist der Doppelpunkt nicht erforderlich, da hier
keine Verwechslungsgefahr mit den Datenbankobjekten besteht. Diese
können nicht durch eine einfache Zuweisung verändert werden, sondern
nur durch die ändernden Anweisungen, die Sie in Kapitel 5 kennen lernen
werden.
6208.book Seite 64 Mittwoch, 5. September 2018 1:04 13
2.2 Grundlegende Sprachelemente
65
2
2.2.7 Systemvariablen
In SQLScript gibt es einige Systemvariablen, die in Ihrem Kontext jeweils
nützliche Informationen liefern können. Sie sind vor allem für das Analy-
sieren und Protokollieren von Fehlersituationen nützlich. Die Systemvaria-
blen beginnen mit zwei führenden Doppelpunkten.
� ::CURRENT_OBJECT_NAME
Name der Prozedur oder Funktion, in der die Systemvariable abgefragt
wird. In anonymen Blöcken hat die Variable den Wert NULL. Außerhalb
von logischen Containern (siehe Abschnitt 2.3) liefert der Zugriff auf die
Variable einen Fehler.
� ::CURRENT_OBJECT_SCHEMA
Datenbankschema der Prozedur oder Funktion, in der die Systemvaria-
ble abgefragt wird. Die Sichtbarkeit ist wie bei der Variable ::CURRENT_
OBJECT_NAME
� ::SQL_ERROR_CODE
Enthält den aktuellen Fehlercode. Diese Variable ist nur innerhalb von
Fehlerbehandlern (siehe Abschnitt 6.8) sichtbar.
� ::SQL_ERROR_MESSAGE
Enthält die Nachricht zum aktuellen Fehlercode. Die Sichtbarkeit ist ana-
log zu der Variable ::SQL_ERROR_CODE.
� ::ROWCOUNT
Die Variable enthält die Anzahl der durch die letzte ändernden Daten-
bankanweisung veränderten Datensätze. Lesende Datenbankanweisun-
gen sind nicht relevant. Falls Sie die Variable abfragen, bevor eine än-
dernde Datenbankanweisung stattgefunden hat, wird ein Fehler erzeugt.
� ::CURRENT_LINE_NUMBER
Enthält die Zeilennummer im Quellcode. Diese Variable gibt es erst mit
SAP HANA 2.0 SPS02.
Praktische Beispiele für die Verwendung der Systemvariablen finden Sie in
Abschnitt 6.8 über die Fehlerbehandlung.
2.2.8 Reservierte Wörter
Es gibt eine Menge von Wörtern, die nicht als Bezeichner in SQLScript ver-
wendet werden sollten, da diese für die Sprache selbst reserviert sind. Sie
können deswegen auch nur in der speziellen Notation als Bezeichner ver-
wendet werden, da sonst keine eindeutige Semantik mehr gegeben ist.
6208.book Seite 65 Mittwoch, 5. September 2018 1:04 13
2 Die ersten Schritte mit SQLScript
66
Die Menge dieser Schlüsselwörter für SQLScript können Sie aus dem Sys-
temview RESERVED_KEYWORDS mit der Anweisung SELECT * FROM RESERVED_
KEYWORDS; auslesen.
Außerdem ist es empfehlenswert, die Schlüsselwörter der anderen an dem
Projekt beteiligten Programmiersprachen und dem aktuellsten ANSI-SQL-
Standard zu meiden, damit hier keine Komplikationen auftreten.
2.2.9 Operatoren
Operatoren berechnen ein Ergebnis aus den Operanden. Beispielsweise kann
man zwei Zahlen mit dem Plus-Operator + zu ihrer Summe verknüpfen:
Ergebnis = Zahl1 + Zahl2;
Man kann die Operatoren nach der Anzahl ihrer Operanden in unäre und
binäre Operatoren unterteilen. Unäre Operatoren haben genau einen Ope-
randen, binäre genau zwei. Tabelle 2.2 zeigt Beispiele dafür.
Operatoren nach
Datentypen
Es gibt, nach dem Datentyp des Ergebnisses gruppiert, die folgenden Opera-
toren:
� Arithmetische Operatoren liefern ein numerisches Ergebnis.
– Addition: +
– Subtraktion: –
– Multiplikation: *
– Division : /
– Negation: – als Vorzeichen
� Zeichenkettenoperatoren zum Verketten von Zeichenketten zu einer
neuen Zeichenkette: ||
� Vergleichsoperatoren liefern als Ergebnis eine Aussage in boolescher
Logik, die entweder TRUE, FALSE oder UNKNOWN sein kann. UNKNOWN ent-
spricht einem NULL-Wert der Datenbank. Das Ergebnis der Operatoren ist
immer genau dann UNKNOWN, wenn ein Operand NULL ist.
Operatortyp Muster Beispiel
Unär <Operator><Operand> –9
Binär <Operand1><Operator><Operand2> 3+4
Tabelle 2.2 Unterscheidung der Operatoren nach der Anzahl der Operanden
6208.book Seite 66 Mittwoch, 5. September 2018 1:04 13
2.2 Grundlegende Sprachelemente
67
2
– Gleich =
– Ungleich != oder <>
– Kleiner als <
– Größer als >
– Kleiner gleich <=
– Größer gleich >=
� Logische Operatoren verknüpfen logische Aussagen zu neuen logischen
Aussagen.
– AND: Wenn beide Operanden TRUE ergeben, ist das Ergebnis auch TRUE.
– OR: Wenn mindestens einer der beiden Operanden TRUE ist, ist das Er-
gebnis TRUE.
– NOT: Dieser unäre Operator negiert den Wert seines Operanden. Aus
TRUE wird FALSE und umgekehrt.
Für alle Operatoren gilt, dass das Ergebnis jeweils NULL ist, wenn ein Ope-
rand NULL ist.
VorfahrtsregelnFalls in einem Ausdruck mehrere Operatoren vorkommen, gibt es Vor-
fahrtsregeln, in welcher Reihenfolge die Operatoren ausgewertet werden.
Damit ist sichergestellt, dass das Ergebnis eines Ausdrucks eindeutig fest-
gelegt ist. In Tabelle 2.3 sehen Sie die Auswertungsreihenfolge der Operato-
ren 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
Tabelle 2.3 Auswertungsreihenfolge der Operatoren von oben nach unten
6208.book Seite 67 Mittwoch, 5. September 2018 1:04 13
2 Die ersten Schritte mit SQLScript
68
Selbst wenn Sie die Auswertungsreihenfolge der Operatoren kennen, soll-
ten Sie im Falle von mehr als zwei Operatoren immer Klammern verwen-
den. Das erhöht die Lesbarkeit erheblich, und es erlaubt auch weniger er-
fahrenen Kollegen Ihren Quellcode korrekt zu interpretieren. In dem
einfachen Beispiel in Listing 2.6 sieht man bereits, wie die Klammerung die
Lesbarkeit erheblich erhöht. Und das, obwohl es sich hier nur um die aus
der Schulzeit geläufige »Punkt-vor-Strich-Regel« handelt.
SELECT"PURCHASEORDERID","PURCHASEORDERITEM","PRODUCT.PRODUCTID","CURRENCY",case
when netamount <> 0--- Mit Klammerung:--- then ((grossamount / netamount) * 100) - 100--- Ohne Klammerung:
then grossamount / netamount * 100 - 100else 0end as tax,
"GROSSAMOUNT","NETAMOUNT","TAXAMOUNT","QUANTITY","QUANTITYUNIT","DELIVERYDATE"
FROM "SAP_HANA_DEMO"."sap.hana.democontent.epm.data::PO.Item";
Listing 2.6 Beispiel für Klammerung von Operatoren
Häufig ist es auch sinnvoll, komplexere Ausdrücke mit mehreren Operato-
ren in mehrere kleinere Schritte zu zerlegen. Somit erhalten Sie Zwische-
nergebnisse, die die Fehlersuche im Debugger erheblich erleichtern. Die
Ausführungsgeschwindigkeit wird sich durch diese Maßnahme nicht rele-
vant verändern, da die SAP-HANA-Datenbank die Ausdrücke vor der Aus-
führung entsprechend optimiert.
Die Mengenoperatoren UNION (ALL), INTERSECT und EXCEPT werden hier nicht
beschrieben. Sie werden stattdessen im Abschnitt 3.2.9 im Zusammenhang
mit der SELECT-Anweisung im Detail besprochen.
6208.book Seite 68 Mittwoch, 5. September 2018 1:04 13
2.2 Grundlegende Sprachelemente
69
2
2.2.10 Ausdrücke
Ein Ausdruck ist ein Sprachkonstrukt, das in seinem Kontext ausgewertet
wird und dabei einen Wert zurückgibt. Ausdrücke können an verschiede-
nen Stellen in einer SQL-Anweisung vorkommen, wie z. B. in der SELECT-,
WHERE oder GROUP BY-Klausel. Die folgenden Dinge können hier als Ausdrü-
cke verwendet werden:
� Literale
� Konstanten- und Variablennamen
� Spaltennamen
� Funktionsaufrufe
� Verknüpfung von Ausdrücken mit Operatoren
� CASE-Anweisungen
� Unterabfragen
� Aggregatfunktionen
Manche Ausdrücke können zum Teil selbst wiederum aus anderen Ausdrü-
cken zusammengesetzt sein. So ist es z. B. möglich, bei einem Funktions-
aufruf für die Parameter auch wieder Ausdrücke zu verwenden. Somit kann
es sich bei Ausdrücken immer auch um tiefer verschachtelte Konstrukte
handeln.
Kontext von
Ausdrücken
Nicht alle Ausdrücke sind in jedem Kontext möglich. Beispielsweise kön-
nen Aggregatfunktionen nur sinnvoll in SELECT-Anweisungen verwendet
werden. Für die Zuweisung einer skalaren Variablen kann eine Aggregat-
funktion nicht verwendet werden.
Im Beispiel von Listing 2.7 sehen Sie einige der oben genannten Arten von
Ausdrücken, insbesondere auch die verschachtelte Verwendung von Aus-
drücken in Ausdrücken.
SELECT-- Feldname als Ausdruck
id,-- Verkettungsoperation als Ausdruck
vorname || ' ' || nachname AS name,-- CASE-Ausdruck ...
CASE-- ... mit Funktionsaufruf als Ausdruck
WHEN geschlecht = 'F' THEN NCHAR('9792')WHEN geschlecht = 'M' THEN NCHAR('9794')ELSE ''
END AS MW,
6208.book Seite 69 Mittwoch, 5. September 2018 1:04 13
2 Die ersten Schritte mit SQLScript
70
-- Funktionsaufruf als AusdruckCOALESCE(team, 0) AS team
FROM benutzer;
Listing 2.7 Ausdrücke in Feldlisten
2.2.11 Prädikate
Bei Prädikaten handelt es sich um logische Aussagen, die in den Selektions-
bedingungen von SELECT-Anweisungen verwendet werden können. Wenn
die Aussage für eine Zeile nach TRUE ausgewertet wird, dann wird diese Zeile
in die Ergebnismenge mit übernommen.
In Kapitel 3 werden die Prädikate im Zusammenhang mit der WHERE-Klausel
ausführlich behandelt.
2.2.12 Datentypen
Wir brauchen Datentypen, um Daten in einer Datenbankspalte zu spei-
chern, um sie in Prozeduren in lokalen Variablen zu verarbeiten oder um
sie als Parameter zu übergeben. Der Datentyp definiert immer, wie die
Daten aussehen und welchen Operationen mit diesen Daten möglich sind.
Skalare Datentypen
Unter einem skalaren Datentyp verstehen wir ein Konstrukt, dass genau
einen Wert speichern kann. Das kann z. B. eine Zahl oder eine Zeichenkette
sein. Das Gegenteil eines skalaren Datentyps ist ein zusammengesetzter
Datentyp, wie z. B. eine Tabelle.
In der Literatur über objektorientierte Programmiersprachen wird häufig
auch der Begriff des primitiven Datentyps verwendet. Er entspricht weitge-
hend dem skalaren Datentyp. Beim primitiven Datentyp geht es um die Ab-
grenzung gegenüber den Referenztypen, also den Objekten, wohingegen
der Begriff skalar eine Abgrenzung gegenüber den zusammengesetzten
bzw. tabellenartigen Daten zum Ausdruck bringt.
Skalare Funktionen Von skalaren Funktionen sprechen wir, wenn die Funktion genau einen
Wert zurückliefert. Es gibt es auch Funktionen, die tabellenartige Daten zu-
rückliefern. Eine SELECT-Abfrage liefert immer eine Tabelle zurück. Selbst
wenn die Ergebnistabelle genau eine Spalte und eine Zeile hat, handelt es
sich um eine Tabelle. Wir nennen eine solche Abfrage aber skalare Abfrage.
In SQLScript gibt es viele eingebaute, skalare Datentypen, die Sie in Kapi-
tel 4 kennen lernen.
6208.book Seite 70 Mittwoch, 5. September 2018 1:04 13
2.2 Grundlegende Sprachelemente
71
2
Datentypen für Tabellenvariablen und -parameter
Die tabellenartigen Datentypen benötigen wir für die Definition von Tabel-
lenvariablen und Tabellenparametern. Sie sind immer aus skalaren Daten-
typen zusammengesetzt.
Es gibt die Möglichkeit, Tabellentypen als Datenbankobjekte mit CREATE
TYPE explizit anzulegen. Sie tauchen dann als eigenes Datenbankobjekt im
Katalog des jeweiligen Schemas auf. Alternativ kann man sich auf beste-
hende Datenbanktabellen für die Typisierung beziehen. Oder man definiert
den Tabellentyp direkt im Quellcode durch eine Feldliste.
TypisierungIn Listing 2.8 sehen Sie alle drei Alternativen zur Typisierung für eine lokale
Tabellenvariable.
DO BEGIN-- Typ einer DB-Tabelle
DECLARE lt_tab1 aufgaben;-- Typ eines Tabellentyps
DECLARE lt_tab2 id_text;-- Im Code mit TABLE definierter Tabellentyp
DECLARE lt_tab3 TABLE( id INT,col1 NVARCHAR(12) );
lt_tab1 = SELECT * FROM aufgaben;lt_tab2 = SELECT id, titel AS text FROM :lt_tab1;lt_tab3 = SELECT id, titel AS col1 FROM :lt_tab1;SELECT * FROM :lt_tab1;SELECT * FROM :lt_tab1;SELECT * FROM :lt_tab1;
END;
Listing 2.8 Unterschiedliche Typisierung von Tabellen
2.2.13 Der Wert NULL
Bei NULL handelt es sich nicht um einen konkreten Wert, sondern um das
Fehlen eines Werts. Insbesondere handelt es sich nicht um einen gültigen
Initialwert wie z. B. 0 oder SPACE. Das bedeutet, dass man mit Spalten bzw.
Feldern mit dem Wert NULL auch keinen sinnvollen Vergleich machen kann.
Entsprechend reagieren die Vergleichsoperatoren zunächst unerwartet.
NULL in Open SQL in ABAP
Auf der SAP-NetWeaver-Plattform mit der Programmiersprache ABAP
kommt der Wert NULL so gut wie nie vor. Dies liegt an der lückenlosen Inte-
6208.book Seite 71 Mittwoch, 5. September 2018 1:04 13
2 Die ersten Schritte mit SQLScript
72
gration des verwendeten Open SQL in die Sprache ABAP. Der schreibende
Zugriff erfolgt fast ausschließlich über einen Arbeitsbereich oder eine in-
terne Tabelle, deren Zeilen der Datenbanktabelle eins zu eins entsprechen.
Innerhalb dieses Arbeitsbereichs oder der internen Tabelle kann kein Feld
NULL sein. Damit kann NULL auch nicht in die Datenbanktabelle geschrie-
ben werden.
Ein anderer Mechanismus, der NULL in der Datenbank vermeidet, ist eine
Einstellung bei der Anlage von Datenbanktabellen im Data Dictionary
(DDic). Hier kann für jede Spalte das Kennzeichen für Initialwerte in Da-
tenbanktabellen gesetzt werden. Dies entspricht einem Zusatz NOT NULLbei der Tabellendefinition in SQL und bewirkt, dass die Spalte immer einen
typgerechten Initialwert hat, z. B. 0 oder SPACE.
Trotzdem kann NULL in der Datenbank vorkommen, wenn z. B. eine Daten-
banktabelle nachträglich um eine Spalte erweitert wurde und bei der Defi-
nition der Spalte die NULL-Werte nicht ausgeschlossen wurden. Entspre-
chend gibt es auch in Open SQL die Möglichkeit, auf NULL in einer Spalte zu
selektieren.
Beispiel Ein einfaches Beispiel in Listing 2.9 verdeutlicht die Situation. Hier wird
eine Datenbanktabelle TEST_NULL mit den beiden Spalten ID und NAME ange-
legt, und in diese werden fünf Datensätze geschrieben, wobei im letzten Da-
tensatz der Wert für NAME nicht angegeben wird. Entsprechend steht in der
Spalte der Wert NULL (siehe Abbildung 2.8).
Abbildung 2.8 Darstellung von NULL als Fragezeichen in SAP HANA Studio
Interessant wird das Beispiel bei der Ausführung der beiden SELECT-Anwei-
sungen. Man würde naiv erwarten, dass die erste Anweisung die ersten drei
Datensätze findet, da die Namen alle mit P anfangen und die zweite Anwei-
sung dann alle anderen Datensätze liefert, da sie nicht mit P anfangen. Tat-
sächlich wird der Datensatz mit ID=5 von keinem der beiden SELECT-
Anweisungen gelesen.
6208.book Seite 72 Mittwoch, 5. September 2018 1:04 13
2.2 Grundlegende Sprachelemente
73
2
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 * FROM test_null WHERE name LIKE 'P%';
SELECT * FROM test_null WHERE name NOT LIKE 'P%';
DROP TABLE test_null; --Um die Tabelle wieder zu entfernen
Listing 2.9 Selektion auf eine Spalte mit NULL-Werten
Falls man also auf eine Spalte selektiert, die NULL-Werte enthalten kann, so
muss man diese immer mitberücksichtigen. Für das obige Beispiel wäre
eine zusätzliche Abfrage auf IS NULL sinnvoll:
SELECT * FROM test_null WHERE name NOT LIKE 'P%'OR name IS NULL;
In den Entwicklungsumgebungen können Sie bei den Einstellungen festle-
gen, wie der Wert NULL dargestellt werden soll. Üblich ist hier entweder das
Fragezeichen (?) oder die Zeichenkette NULL.
2.2.14 Die Tabelle DUMMY
Bei DUMMY handelt es sich um eine Datenbanktabelle mit genau einer Spalte
namens DUMMY, die genau eine Zeile mit dem Inhalt "X" enthält. Da der Inhalt
der Tabelle nicht geändert werden darf, können Sie sich auf diese Eigen-
schaften stets verlassen.
BeispieleEin Anwendungsfall für die Tabelle DUMMY ist der Test von Ausdrücken. Da
Sie in der SQL-Konsole nicht direkt SQLScript-Code ausführen können,
ohne einen anonymen Block darum zu bauen, ist DUMMY eine praktische Al-
ternative. In Listing 2.10 sehen Sie, wie Sie z. B. die Funktion TO_DATS( ) für
die Datumskonvertierung testen können.
6208.book Seite 73 Mittwoch, 5. September 2018 1:04 13
2 Die ersten Schritte mit SQLScript
74
-- Test mit DUMMYSELECT TO_DATS('2016-01-01') FROM dummy;
-- Der gleiche Test mit einem anonymen BlockDO (OUT rv_result NVARCHAR(10) =>?)BEGIN
rv_result = TO_DATS('2016-12-31');END;
Listing 2.10 Die Tabelle DUMMY zum Testen von Ausdrücken
Eine andere praktische Anwendung für die Tabelle DUMMY ist, dass Sie eine
leere Tabelle mit einer festen Struktur erzeugen. Das ist z. B. der Fall, wenn
Sie in SAP BW eine Transformationsroutine als ABAP Managed Database
Procedure (AMDP) implementieren. In der generierten Schnittstelle dieser
Prozedur ist eine Tabelle mit dem Namen ERRORTAB definiert. Wenn dieser
Tabelle kein Wert zugewiesen ist, dann lässt sich die Prozedur nicht aktivie-
ren, und es wird ein Syntaxfehler angezeigt. Durch den Code in Listing 2.11
kann eine leere Tabelle mit der passenden Struktur erzeugt werden.
errorTab = SELECT '' AS ERROR_TEXT,'' AS SQL__PROCEDURE__SOURCE__RECORD
FROM dummyWHERE dummy = 'Y';
Listing 2.11 Erzeugen einer leeren Tabelle mit Hilfe von DUMMY
In anderen Datenbanksystemen gibt es ebenfalls solche DUMMY-Tabellen, auch wenn sich die Namen teilweise unterscheiden.
6208.book Seite 74 Mittwoch, 5. September 2018 1:04 13
15
0Einleitung
Die SAP-HANA-Datenbank wurde im Jahr 2010 von SAP der Öffentlichkeit
vorgestellt. Die Programmiersprache SQLScript ist der zugehörige »SQL-
Dialekt«, mit dem man Abfragen an SAP HANA schicken kann. Sie war von
Anfang an Bestandteil von SAP HANA. Trotzdem gibt es bis heute (Stand:
August 2018) kein gedrucktes Lehrbuch zu dieser Sprache. Diese Lücke
möchte ich mit dem vorliegenden Werk schließen.
Warum ein Buch?Heutzutage finden sich genügend Informationen im Internet. Warum
braucht es denn überhaupt noch ein Buch? Tatsächlich habe ich fast alles
Wissen, das Sie auf den nächsten 400 Seiten finden werden, entweder aus
dem Internet oder durch die Arbeit mit unterschiedlichen SAP-HANA-
Systemen selbst erworben. Zu einem kleinen Teil kommen noch Informa-
tionen dazu, die ich im Austausch mit Kollegen oder Mitarbeitern von SAP
erhalten habe. Also warum ein Buch? Jeder kann doch die relevanten Infor-
mationen selbst im Internet suchen und mit dem System seine eigenen Er-
fahrungen machen.
Die wichtigste Quelle im Internet für Informationen über SQLScript sind
die Referenzdokumentationen von SAP. Über die Eingabe der in diesem
Buch an verschiedenen Stellen angegebenen Titel in eine Suchmaschine
können Sie diese Dokumente im Internet abrufen. Sie enthalten eine große
Menge an Details, es fehlt ihnen jedoch eine geeignete Struktur, die ein
Lehrbuch besitzen sollte. Die Referenzdokumentationen sind als Nach-
schlagewerke gedacht und in Funktion sehr wichtig. Zum systematischen
Lernen taugen sie wenig.
Die andere wichtige Quelle im Internet sind Blogs und Foren. In ihnen spie-
geln sich die Erfahrungen vieler Anwender mit der Sprache SQLScript wi-
der. Entsprechend sind viele nützliche und interessante Informationen
darin zu finden, die teilweise auch in der Referenzdokumentation fehlen.
Die Qualität der Beiträge ist aber sehr unterschiedlich. Manche Autoren
bieten wirklich hochkarätige Inhalte, während andere z. B. ihre mittelmäßi-
gen Workarounds zum Lösen eines Problems vorstellen. Entsprechend
muss man alles, was man dort liest, in Frage stellen und am besten am eige-
nen System ausprobieren. Grundsätzlich fehlt auch in Blogs und Foren eine
Struktur, die für das Erlernen der Sprache geeignet ist.
Was dieses Buch also, neben der physischen Existenz als Papierstapel, von
den frei zugänglichen Quellen im Internet unterscheidet:
6208.book Seite 15 Mittwoch, 5. September 2018 1:04 13
Einleitung
16
� Eine Quelle, nicht hunderte – Wenn Sie etwas suchen, dann finden Sie im
Inhaltsverzeichnis oder im Index die eine passende Stelle.
� Struktur – Es handelt sich um ein Lehrbuch. Sie können es von vorne
nach hinten durcharbeiten.
� Qualität – Alle Beispiele wurden getestet, und alle Informationen wur-
den am System überprüft.
� Die Sprache – Das Buch liegt in deutscher Sprache vor. Damit lässt es sich
für deutsche Muttersprachler leichter lesen. Auch für Fachbegriffe
wurde die deutschen Ausdrücke verwendet, soweit sie im allgemeinen
Sprachgebrauch üblich sind. Das ist leider immer eine Gratwanderung
zwischen den beiden Extremen: Denglisch und »mit Gewalt einge-
deutscht«.
An wen richtet sich
das Buch?
Das vorliegende Buch ist als Lehrbuch konzipiert. Sie benötigen dement-
sprechend keine Vorkenntnisse über die SAP-HANA-Datenbank oder SQL-
Script. Trotzdem richtet sich das Buch nicht an Laien. Ich gehe davon aus,
dass Sie bereits Erfahrungen mit Programmierung haben und dass Ihnen
auch SQL ein Begriff ist. Mit der Sprache SQLScript alleine können Sie keine
Anwendung entwickeln. Trotzdem wird jeder Leser einen Anwendungsfall
haben, für den er diese Sprache nutzen möchte. Dafür kommen unter-
schiedliche Plattformen in Frage, wie z. B.:
� Das SAP Business Warehouse (SAP BW), in dem die Transformationslogik
in SQLScript-Routinen ausgelagert werden sollen
� Ein SAP-ERP- oder SAP-NetWeaver-System, auf dem aus ABAP heraus
SQLScript in AMDP-Methoden genutzt werden soll
� Native SAP-HANA-Anwendungen, die auf dem XSC- oder XSA-Anwen-
dungsserver laufen
� Anwendungen, die auf Nicht-SAP-Systemen basieren und über die SQL-
Schnittstelle auf die SAP-HANA-Datenbank zugreifen
Ich habe dementsprechend für alle diese unterschiedlichen Anwendungs-
fälle hier die relevanten Informationen in einem Buch zusammengetragen.
Den ersten beiden Fällen habe ich auch jeweils ein eigenes Kapitel gewid-
met. Wer nicht mit SAP BW arbeitet oder nicht auf dem SAP-NetWeaver-
Applikationsserver programmiert, kann diese Kapitel getrost übersprin-
gen.
Übungssystem Um dieses Buch durchzuarbeiten, sollten Sie selbst einen Zugang zu einer
SAP-HANA-Datenbank haben. Für das Verständnis der Beispiele ist es sehr
hilfreich, wenn man sie selber ausführen kann. Im Idealfall haben Sie bereits
in Ihrer Firma Zugriff auf eine SAP-HANA-Datenbank für die Entwicklung.
6208.book Seite 16 Mittwoch, 5. September 2018 1:04 13
Einleitung
17
Falls das (noch) nicht der Fall ist, ist das auch kein Problem. Denn mittlerwei-
le gibt es mehrere Optionen, um einen einfachen und kostengünstigen Zu-
gang zu einer SAP-HANA-Datenbank zu bekommen. Im Anhang finden Sie
dazu drei kurze Anleitungen für die folgenden Szenarien:
� Eine eigene Datenbank auf einem Multi-Tenant-Datenbanksystem auf
der SAP Cloud Platform
� Die lokale Installation von SAP HANA, Express Edition auf Ihrem Rechner
� Starten einer virtuellen Maschine mit vorinstalliertem SAP HANA, Ex-
press Edition auf der Google Cloud Platform
Allen drei Optionen ist gemeinsam, dass Sie sich in einem begrenzten, aber
zum Lernen völlig ausreichenden Umfang kostenlos nutzen lassen.
Probieren geht über
Studieren
Für alle Beispiele in den Listings empfehle ich Ihnen, sie am eigenen System
auszuprobieren und sich das Ergebnis zu betrachten. Manche der Beispiele
sind so ausgewählt, dass sie die Grenzbereiche der jeweiligen Funktionen
ausleuchten oder auch unerwartetes Verhalten aufzeigen. Es ist auch lehr-
reich, die Beispiele etwas abzuwandeln oder selbst Beispiele für die Sach-
verhalte zu entwickeln.
Die Listings sind meistens so aufgebaut, dass sie sich direkt in der SQL-Kon-
sole ausführen lassen und dass sie auch ihre erzeugten Datenbankobjekte
wieder aufräumen. Beispielsweise werden Datenbanktabellen, die mit
CREATE TABLE XY angelegt wurden, am Ende eines Listings auch immer mit
DROP TABLE XY wieder gelöscht. Somit können die Beispiele beliebig oft aus-
geführt werden, ohne sich gegenseitig zu beeinflussen.
Viele Beispielen beruhen auch auf einem einfachen Datenmodell, das ich
für dieses Buch entworfen habe. Es handelt sich dabei um eine kleine Auf-
gabenverwaltung für mehrere Projekte mit unterschiedlichen Teams. Die-
ses Demo-Datenmodell mitsamt ein paar Testdaten können Sie als Skript
auf Ihrem System einspielen. Die notwendigen Dateien können Sie auf
der Webseite zum Buch herunterladen (auf www.sap-press.de/4614 unter
Materialien zum Buch). Alternativ finden Sie die Beispiele auch auf Github
(https://github.com/captainabap/SQLScript-fuer-SAP-HANA).
QuellcodeIch habe versucht, den Quellcode in den Beispielen möglichst einheitlich zu
formatieren. Dabei liegt der Fokus auf der leichten Lesbarkeit. Die relevan-
ten Stellen und manche Kommentare habe ich fett hervorgehoben.
Die Bezeichner von Tabellen, Spalten, Parametern, Variablen usw. im Code
habe ich überwiegend in deutscher Sprache gewählt. Das sieht teilweise
etwas ungewohnt aus. Für die Benennung von Parametern und Variablen
habe ich eine Variante der ungarischen Notation in Form eines zweistel-
6208.book Seite 17 Mittwoch, 5. September 2018 1:04 13
Einleitung
18
ligen Präfixes verwendet. Die erste Stelle bezeichnet, ob es sich um eine lo-
kale Variable (L), einen IN-Parameter (I), einen OUT-Parameter (O) oder ein
RETURN-Parameter (R) handelt. Die zweite Stelle legt fest, ob es ein skalarer
Wert (V) oder eine Tabelle (T) ist. Diese Notation entspricht einem häufig in
ABAP verwendeten Schema. Beispiele:
� lt_var ist eine lokale Tabellenvariable
� iv_counter ist ein skalarer IN-Parameter
� ot_result ist ein OUT-Tabellenparameter
Die hier verwendete Notation ist kein Standard, ich halte sie aber für prak-
tisch. Für die bessere Lesbarkeit des Quellcodes in diesem Buch ist sie auf
jeden Fall hilfreich.
Alle Schlüsselwörter von SQLScript und alle SQL-Funktionen sind in
GROSSBUCHSTABEN geschrieben, die Bezeichner dagegen in Kleinbuchsta-
ben. Das entspricht dem häufig verwendeten Layout des Pretty Printers in
ABAP.
Aufbau des Buchs
Das Buch startet in Kapitel 1 mit SAP HANA. Dabei werden nicht nur der As-
pekt der spaltenorientierten In-Memory-Datenbank betrachtet, sondern
auch die Funktion von SAP HANA als Anwendungsserver besprochen. Sie
lernen außerdem die unterschiedlichen Entwicklungsumgebungen, die
Organisation der Entwicklungsobjekte im Datenbankkatalog und die SQL-
Konsole kennen.
In Kapitel 2 geht es mit den Grundlagen der Sprache SQLScript los. Das ist
zunächst eher trocken, weil hier die formalen Aspekte der Sprache bespro-
chen werden. Danach springen wir mit dem Thema logische Container
gleich ins kalte Wasser, und Sie lernen die Konzepte von (anonymen) Blö-
cken, Prozeduren und Funktionen kennen. Diese nutzen wir dann auch in
dem ersten umfangreicheren Beispiel, an dem Sie die Modularisierungs-
techniken und ein strukturiertes Vorgehen zur Entwicklung von SQLScript-
Funktionen und -Prozeduren sehen können.
Das Schreiben von deklarativen SQLScript-Abfragen ist Thema von Kapitel 3.
Das bedeutet, dass Sie als Entwickler der Datenbank mit Ihrem Quellcode
mitteilen, welche Daten Sie gerne hätten. In welcher Reihenfolge die Aus-
führung erfolgt und wie das vielleicht noch optimiert werden kann, bleibt
der Datenbank überlassen. Damit liegt ein Schwerpunkt auf der sicherlich
bekannten SELECT-Anweisung. Auch wenn Sie diese bereits kennen, lohnt
sich ein Blick in das Kapitel. Gerade für ABAP-Entwickler, die bislang nur
6208.book Seite 18 Mittwoch, 5. September 2018 1:04 13
Einleitung
19
mit Open SQL gearbeitet haben, stecken da noch viele nützliche Informatio-
nen drin, unter anderem über das Konzept der Ausdrücke, die in dieser
Form in ABAP nicht vorkommen.
In Kapitel 4 geht es um die unterschiedlichen Datentypen für Zeichenket-
ten, Datum, Zeit, Zeitstempel und numerische Daten. Für diese existieren
viele hilfreiche SQL-Funktionen, die in Ausdrücken der SQLScript-Anwei-
sungen an unterschiedlichster Stelle verwendet werden können.
In Kapitel 5 starten wir mit den SQL-Anweisungen für schreibenden Zugriff
auf die Datenbank. Im Gegensatz zu den bis hierhin verwendeten deklara-
tiven Anweisungen handelt es sich dabei um sogenannten imperativen
Code. Sie sagen also der Datenbank Schritt für Schritt, was sie in welcher
Reihenfolge machen soll.
Kapitel 6 beschäftigt sich vor allem mit der Ablaufsteuerung durch Schlei-
fen und Bedingungen. Aber auch Themen wie dynamisches SQL, Transak-
tionssteuerung und Fehlerbehandlung werden hier besprochen.
Das Anlegen, Ändern und Löschen von Datenbankobjekten mit SQLScript
ist Thema von Kapitel 7. Auch wenn Sie diese Anweisungen in Ihren An-
wendungen nicht benötigen, können sie für Tests und Übungen eine große
Hilfe sein. Unter anderem lernen Sie hier auch noch die Konzepte von
Sequenzen und Triggern kennen, die bei der Entwicklung von datenbank-
nahen Anwendungen eine Rolle spielen können.
In Kapitel 8 geht es um die Nutzung von SAP-HANA-Datenbankobjekten,
insbesondere von SQLScript-Prozeduren und benutzerdefinierten Funktio-
nen (UDF), aus der Programmiersprache ABAP heraus. Dabei lernen Sie das
AMDP-Framework kennen, das sich um viele Aspekte, z. B. Transport und
Berechtigungen der zugehörigen Objekte, kümmert.
Um die Verwendung von SQLScript im SAP Business Warehouse (SAP BW)
geht es in Kapitel 9. Hierbei spielt wiederum die Verwendung von AMDPs
eine entscheidende Rolle, die in SAP BW für die Implementierung von
Transformationsroutinen genutzt werden können.
Kapitel 10 widmet sich dem Thema, wie Sie sauberen SQLScript-Code er-
stellen können, also Code, der gewissen Qualitätsansprüchen genügt: Er
soll zum Beispiel performant, wartbar und wiederverwertbar sein.
Im letzten Kapitel 11 geht es um Test und Analyse Ihrer Entwicklungsobjek-
te. Dabei lernen Sie die Debugger der unterschiedlichen Entwicklungsum-
gebungen kennen, die uns einen Einblick in den Programmablauf erlauben.
Für die Optimierung von Laufzeitproblemen besprechen wir die Werkzeu-
6208.book Seite 19 Mittwoch, 5. September 2018 1:04 13
Einleitung
20
ge für die Analyse und Darstellung des Ausführungsplans von SQLScript-
Anweisungen.
Im Anhang finden Sie Informationen darüber, wie Sie mit geringem Auf-
wand und ohne Kosten Ihr eigenes kleines SAP-HANA-System zum Testen
betreiben können. Außerdem ist dort das Demo-Datenmodell beschrieben,
auf das ich mich in diesem Buch immer wieder beziehe. Ich empfehle Ih-
nen, das Datenmodell auf Ihrem System zu Testzwecken zu installieren,
damit Sie alle Beispiele nachvollziehen können.
Um die Themen bestmöglich zu vermitteln, verwende ich in diesem Buch
nicht nur viele Listingbeispiele und Abbildungen, sondern auch Kästen mit
weiteren Informationen. Diese sind mit verschiedenen Icons markiert:
� Tipp: Kästen mit diesem Icon geben Ihnen Empfehlungen zu Einstellun-
gen oder Tipps aus der Berufspraxis.
� Hinweis: Dieses Icon weist Sie auf zusätzliche Informationen hin.
� Achtung: Mit diesem Icon habe ich Warnhinweise und typische Fallen
gekennzeichnet.
Danksagungen
Ich möchte mich aus den unterschiedlichsten Gründen bei allen bedanken,
die direkt oder indirekt dazu beigetragen haben, dass dieses Buch entste-
hen konnte:
� Bei Prof. Guido Moerkotte, der mir in seinen Vorlesungen die Grundla-
gen von Datenbanken und SQL beigebracht hat. Er hat uns Studenten da-
mals auch die drei wichtigsten Eigenschaften von Datenbanken nahege-
legt: Performance, Performance, Performance!
� Bei meinen Kunden, bei denen ich an spannenden Projekten mitarbei-
ten durfte und bei denen ich eine Menge über SQLScript und die SAP-
HANA-Datenbank gelernt habe. Sie haben mir auch die zeitliche Flexibi-
lität ermöglicht, dieses Buch zu schreiben!
� Bei meinen Kollegen und Freunden, mit denen ich viele Aspekte dieses
Buchs diskutieren konnte und von denen ich wertvolles Feedback be-
kommen habe.
� Bei den Autoren der vielen Blogs und Forenbeiträgen zu den Themen des
Buches. Sie haben mir viele nützliche Informationen gegeben!
� Bei den Mitarbeitern des Rheinwerk Verlags, insbesondere Kerstin Billen
und Janina Karrasch, für die großartige Unterstützung.
6208.book Seite 20 Mittwoch, 5. September 2018 1:04 13
Einleitung
21
Und zu guter Letzt möchte ich mich natürlich auch bei Bettina, Julia und
Henrik für ihre große Geduld und tatkräftige Unterstützung bedanken.
Allen zusammen ein herzliches Dankeschön! Ohne Euch hätte ich das nicht
geschafft.
Jörg Brandeis
SAP Beratung & Entwicklung
www.brandeis.de
6208.book Seite 21 Mittwoch, 5. September 2018 1:04 13
Auf einen Blick
1 SAP HANA .............................................................................................. 23
2 Die ersten Schritte mit SQLScript .................................................. 53
3 Deklarative Programmierung in SQLScript ............................... 103
4 Datentypen und ihre Verarbeitung .............................................. 155
5 Schreibender Zugriff auf die Datenbank .................................... 207
6 Imperative Programmierung .......................................................... 219
7 Datenbankobjekte anlegen, löschen und verändern ............. 267
8 SQLScript in ABAP-Programmen ................................................... 285
9 SQLScript in SAP BW .......................................................................... 315
10 Sauberer SQLScript-Code ................................................................. 339
11 Tests, Fehler- und Performanceanalyse ...................................... 357
6208.book Seite 5 Mittwoch, 5. September 2018 1:04 13
7
Inhalt
Einleitung .......................................................................................................................... 15
1 SAP HANA 23
1.1 Was ist SAP HANA? ........................................................................................ 24
1.1.1 SAP HANA – eine schnelle SQL Datenbank ............................. 24
1.1.2 SAP HANA – ein Applikationsserver .......................................... 29
1.1.3 SAP HANA – eine Werkzeugsammlung ................................... 30
1.2 Systemarchitektur ......................................................................................... 31
1.2.1 Serverkomponenten von SAP HANA ......................................... 32
1.2.2 Datenbanken und Tenants .......................................................... 33
1.3 Organisation der Datenbankobjekte ................................................... 35
1.3.1 Datenbankschema .......................................................................... 35
1.3.2 Datenbankkatalog .......................................................................... 37
1.3.3 Content und Repository ................................................................ 38
1.4 Entwicklungsumgebungen ........................................................................ 39
1.4.1 SAP HANA Studio ............................................................................ 40
1.4.2 Web-based Development Workbench ..................................... 43
1.4.3 SAP Web IDE ...................................................................................... 46
1.5 SQL-Konsole ..................................................................................................... 48
1.5.1 SQL-Konsole aufrufen .................................................................... 48
2 Die ersten Schritte mit SQLScript 53
2.1 SQL vs. SQLScript ............................................................................................ 54
2.2 Grundlegende Sprachelemente ............................................................... 57
2.2.1 Anweisungen .................................................................................... 58
2.2.2 Whitespace ....................................................................................... 58
2.2.3 Kommentare ..................................................................................... 59
2.2.4 Literale ................................................................................................ 60
2.2.5 Bezeichner ......................................................................................... 62
2.2.6 Zugriff auf lokale Variablen und Parameter .......................... 64
2.2.7 Systemvariablen .............................................................................. 65
6208.book Seite 7 Mittwoch, 5. September 2018 1:04 13
Inhalt
8
2.2.8 Reservierte Wörter ......................................................................... 65
2.2.9 Operatoren ....................................................................................... 66
2.2.10 Ausdrücke ......................................................................................... 69
2.2.11 Prädikate ........................................................................................... 70
2.2.12 Datentypen ...................................................................................... 70
2.2.13 Der Wert NULL ................................................................................. 71
2.2.14 Die Tabelle DUMMY ...................................................................... 73
2.3 Modularisierung und logische Container ........................................... 74
2.3.1 Blöcke ................................................................................................. 77
2.3.2 Prozeduren ........................................................................................ 79
2.3.3 Benutzerdefinierte Funktionen (UDF) ..................................... 86
2.4 Programmbeispiel ......................................................................................... 90
2.4.1 Anforderung ..................................................................................... 90
2.4.2 Anforderungsanalyse .................................................................... 91
2.4.3 Implementierung ........................................................................... 93
2.4.4 Test der Implementierung .......................................................... 99
3 Deklarative Programmierung in SQLScript 103
3.1 Tabellenvariablen .......................................................................................... 104
3.1.1 Deklaration von Tabellenvariablen .......................................... 105
3.1.2 Verwendung von Tabellenvariablen ........................................ 106
3.2 SELECT-Anweisung ........................................................................................ 106
3.2.1 SELECT-Klausel ................................................................................ 107
3.2.2 Feldliste der SELECT-Klausel ....................................................... 108
3.2.3 FROM-Klausel .................................................................................. 123
3.2.4 Joins .................................................................................................... 125
3.2.5 WHERE-Bedingung ........................................................................ 131
3.2.6 WITH-Klausel ................................................................................... 139
3.2.7 GROUP BY-Klausel .......................................................................... 141
3.2.8 HAVING-Klausel .............................................................................. 143
3.2.9 ORDER BY-Klausel ........................................................................... 144
3.2.10 Mengenlehre ................................................................................... 146
3.2.11 Unterabfragen ................................................................................. 148
3.2.12 Aliasnamen ....................................................................................... 149
3.3 Sonstige Operatoren .................................................................................... 151
3.3.1 Calculation Engine Plan-Operatoren ....................................... 151
3.3.2 Map Merge ....................................................................................... 152
6208.book Seite 8 Mittwoch, 5. September 2018 1:04 13
Inhalt
9
4 Datentypen und ihre Verarbeitung 155
4.1 Zeichenketten .................................................................................................. 156
4.1.1 Datentypen für Zeichenketten ................................................... 156
4.1.2 Konvertierungen ............................................................................. 159
4.1.3 Zeichenkettenfunktionen ............................................................ 159
4.2 Datum und Zeit ............................................................................................... 173
4.2.1 Datumsangaben .............................................................................. 174
4.2.2 Zeitinformationen ......................................................................... 179
4.2.3 Kombinierte Zeit- und Datumsangaben ................................. 181
4.2.4 Verarbeitung von Zeit und Datum ............................................ 181
4.2.5 Beispiele für die Verarbeitung von Zeit ................................... 187
4.3 Numerische Daten ......................................................................................... 189
4.3.1 Grundrechenarten .......................................................................... 190
4.3.2 Wurzeln und Exponenten ............................................................ 191
4.3.3 Logarithmen ..................................................................................... 191
4.3.4 Runden oder Abschneiden ........................................................... 192
4.3.5 Trigonometrie ................................................................................. 194
4.3.6 Zufallszahlen .................................................................................... 194
4.3.7 Vorzeichen ......................................................................................... 194
4.3.8 Mengen und Beträge ..................................................................... 195
4.4 Binäre Datentypen ........................................................................................ 201
4.4.1 Konvertierung zwischen Binär, Hexadezimal und
Zeichenkette ..................................................................................... 202
4.4.2 Bits und Bytes ................................................................................... 203
4.5 Konvertierungen zwischen den Datentypen ..................................... 205
5 Schreibender Zugriff auf die Datenbank 207
5.1 INSERT ................................................................................................................. 208
5.1.1 Einzelne Datensätze ....................................................................... 208
5.1.2 Mehrere Datensätze gleichzeitig einfügen ............................ 209
5.2 UPDATE ............................................................................................................... 211
5.2.1 Einfache UPDATE-Anweisung ..................................................... 212
5.2.2 UPDATE-Anweisung mit Bezug auf andere Tabellen ......... 212
6208.book Seite 9 Mittwoch, 5. September 2018 1:04 13
Inhalt
10
5.3 UPSERT oder REPLACE .................................................................................. 213
5.3.1 Einfügen oder Aktualisieren einzelner Datensätze ............ 213
5.3.2 Einfügen oder Aktualisieren mehrerer Datensätze ............ 214
5.4 MERGE INTO .................................................................................................... 215
5.5 DELETE ................................................................................................................ 217
5.6 TRUNCATE TABLE ........................................................................................... 218
6 Imperative Programmierung 219
6.1 Variablen ........................................................................................................... 219
6.1.1 Lokale skalare Variablen ............................................................... 219
6.1.2 Lokale Tabellenvariablen ............................................................ 224
6.1.3 Sessionvariablen ............................................................................. 232
6.1.4 Temporäre Tabellen ....................................................................... 233
6.2 Ablaufsteuerung mit IF und ELSE .......................................................... 234
6.3 Schleifen ............................................................................................................ 238
6.3.1 Die FOR-Schleife .............................................................................. 238
6.3.2 Die WHILE-Schleife ........................................................................ 239
6.3.3 Steuerung der Schleifendurchläufe ......................................... 240
6.3.4 Übungsbeispiel: größter gemeinsamer Teiler ...................... 240
6.4 Cursors ................................................................................................................ 241
6.4.1 FOR-Schleife über einen Cursor ................................................. 242
6.4.2 Explizites Öffnen, Lesen und Schließen .................................. 243
6.5 Arrays .................................................................................................................. 244
6.5.1 Erzeugen eines Arrays ................................................................... 245
6.5.2 Zugriff auf das Array ..................................................................... 246
6.5.3 Arrays als lokale Variablen .......................................................... 247
6.5.4 Aufteilen und Verbinden von Arrays ....................................... 248
6.5.5 Arrays und Tabellenspalten ........................................................ 248
6.5.6 Übungsbeispiel Bubblesort ......................................................... 250
6.6 Transaktionssteuerung ............................................................................... 252
6.6.1 Transaktionen .................................................................................. 252
6.6.2 Autonome Transaktionen ............................................................ 253
6.7 Dynamisches SQL ausführen .................................................................... 255
6.7.1 Parameter von dynamischem SQL ............................................ 256
6.7.2 Eingabeparameter ......................................................................... 257
6208.book Seite 10 Mittwoch, 5. September 2018 1:04 13
Inhalt
11
6.8 Fehlerbehandlung .......................................................................................... 260
6.8.1 Was sind Ausnahmen? .................................................................. 260
6.8.2 Auslösen von Ausnahmen ........................................................... 261
6.8.3 Abfangen von Ausnahmen .......................................................... 262
7 Datenbankobjekte anlegen, löschen und verändern 267
7.1 Tabellen ............................................................................................................. 268
7.1.1 Anlegen von Datenbanktabellen ............................................... 268
7.1.2 Ändern von Datenbanktabellen ................................................. 272
7.1.3 Löschen von Datenbanktabellen ............................................... 273
7.2 Tabellentypen .................................................................................................. 274
7.3 Sichten (Views) ................................................................................................ 275
7.4 Sequenzen ......................................................................................................... 277
7.4.1 Schrittweite ....................................................................................... 278
7.4.2 Grenzwerte ........................................................................................ 278
7.4.3 Verhalten beim Erreichen der Grenze ...................................... 278
7.4.4 Zurücksetzen der Sequenz ........................................................... 279
7.4.5 Ändern und Löschen einer Sequenz .......................................... 279
7.5 Trigger ................................................................................................................. 279
7.5.1 Parameter .......................................................................................... 282
7.5.2 Pro Zeile oder pro Anweisung ..................................................... 282
8 SQLScript in ABAP-Programmen 285
8.1 AMDP-Prozeduren ......................................................................................... 288
8.1.1 Anlegen von AMDP-Prozeduren ................................................. 289
8.1.2 Generierte Objekte einer AMDP-Methode ............................. 292
8.1.3 Lebenszyklus der generierten Objekte ..................................... 295
8.1.4 Zweigleisige Entwicklung ............................................................. 296
8.1.5 Verwendung von AMDP-Prozeduren in
AMDP-Prozeduren .......................................................................... 299
6208.book Seite 11 Mittwoch, 5. September 2018 1:04 13
Inhalt
12
8.2 CDS-Tabellenfunktionen ............................................................................ 302
8.2.1 Anlegen einer CDS-Tabellenfunktion ...................................... 303
8.2.2 Generierte Objekte einer CDS-Tabellenfunktion ................. 308
8.2.3 Implizite Mandatenbehandlung von
CDS-Tabellenfunktionen .............................................................. 309
8.3 AMDP-Funktionen für AMDP-Methoden ............................................ 310
8.4 Alternativen zu AMDPs für den Aufruf von SQLScript-Code
aus ABAP-Programmen .............................................................................. 312
8.5 Empfehlungen ................................................................................................ 313
9 SQLScript in SAP BW 315
9.1 Transformationsroutinen als AMDP ..................................................... 320
9.2 Aufeinanderfolgende Transformationen und
gemischte Ausführung ................................................................................ 321
9.3 Die generierte AMDP-Klasse .................................................................... 323
9.3.1 Signatur der AMDP-Methode PROCEDURE ........................... 323
9.3.2 Zuweisung der Ausgabetabellen .............................................. 325
9.3.3 Zugriff auf die Daten anderer Datenmodelle ....................... 326
9.4 Die einzelnen Routinen .............................................................................. 329
9.4.1 Startroutinen ................................................................................... 329
9.4.2 Endroutinen ..................................................................................... 330
9.4.3 Expertenroutinen ........................................................................... 331
9.4.4 Feldroutinen ..................................................................................... 333
9.5 Fehlerverarbeitung und Error Stack ...................................................... 334
9.5.1 Ablauf der Verarbeitung im Datentransferprozess ............ 335
9.5.2 Beispiel: Fehlerhafte Daten in Tabelle OUTTAB
erkennen .......................................................................................... 337
9.5.3 Beispiel: Ungültige Feldinhalte mit regulären
Ausdrücken finden ......................................................................... 338
6208.book Seite 12 Mittwoch, 5. September 2018 1:04 13
Inhalt
13
10 Sauberer SQLScript-Code 339
10.1 Die Lesbarkeit des Codes ............................................................................ 340
10.1.1 Formatierung des Codes ............................................................... 340
10.1.2 Sprechende Namen ........................................................................ 341
10.1.3 Granularität von Prozeduren und Funktionen ...................... 343
10.1.4 Kommentare .................................................................................... 346
10.1.5 Komplexe Abfragen zerlegen ...................................................... 347
10.1.6 Lesbare SQLScript-Anweisungen ............................................... 352
10.2 Performance-Empfehlungen ..................................................................... 354
10.2.1 Datenvolumen reduzieren ........................................................... 354
10.2.2 Wechsel zwischen Row- und Column-Engine
vermeiden .......................................................................................... 354
10.2.3 Deklarative Abfragen ..................................................................... 354
10.2.4 Skalare Funktionen ......................................................................... 355
11 Tests, Fehler- und Performanceanalyse 357
11.1 Test von SQLScript Code .............................................................................. 358
11.1.1 Die SQL-Konsole ............................................................................... 358
11.1.2 Testen von AMDP-Methoden ...................................................... 360
11.1.3 Die TRACE-Anweisung ................................................................... 361
11.2 Die Debugger für SQLScript ....................................................................... 363
11.2.1 Der Debugger der WBDW ............................................................ 363
11.2.2 SQLScript-Debugger in SAP HANA Studio .............................. 369
11.2.3 AMDP-Debugger in den ADT ....................................................... 372
11.2.4 Debugging in der SAP Web IDE .................................................. 375
11.3 Performanceanalyse ..................................................................................... 378
11.3.1 Laufzeitmessung ............................................................................. 378
11.3.2 Ausführungsplan ............................................................................ 379
11.3.3 Performanceanalyse in der WBDW ........................................... 381
11.3.4 PlanViz ................................................................................................ 383
11.3.5 SQL Analyzer des Database Explorers der SAP Web IDE .... 391
11.3.6 SQLScript Code Analyzer ............................................................... 393
6208.book Seite 13 Mittwoch, 5. September 2018 1:04 13
Inhalt
14
Anhang 397
A Einrichtung einer SAP-HANA-Instanz als
Entwicklungsumgebung ............................................................................ 399
B Datenmodell: Aufgabenverwaltung ..................................................... 415
C Abkürzungsverzeichnis ............................................................................... 419
D Der Autor ........................................................................................................... 421
Index .................................................................................................................................. 423
6208.book Seite 14 Mittwoch, 5. September 2018 1:04 13
Recommended