23

SQLScript für SAP HANA...de für ABAP-Entwickler ist das eine be liebte Stolperfalle, da sie bislang NULL (fast) nicht beachten mussten. Ein anderes erklärungsbedürftiges Konzept

  • Upload
    others

  • View
    11

  • Download
    1

Embed Size (px)

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