DML Tabellenvariablen in SQLScript

DML Tabellenvariablen in SQLScript

Veröffentlicht am 22. Mai 2020 von

Jörg Brandeis

| SQLScript |

Mit dem Konzept der DML1 Tabellenvariablen hat die SAP die bisherigen Konzepte zum ändernden Zugriff auf Tabellenvariablen in SQLScript sinnvoll Ergänzt. Der Indexbasierte Zugriff und die Änderungsoperatoren waren sperrig und erforderten eine Menge imperativem Quellcode, um keine Änderungen in einer Tabelle zu machen. Das ist mit dem letzten SPS besser geworden, da hier Tabellenvariablen eingeführt wurden, die sich mit den normalen SQL Anweisungen bearbeiten lassen. In der 2. Auflage meines Buches habe ich darüber ein kleines Kapitel geschrieben:

DML Tabellenvariablen in SQLScript

Mit SP04 für SAP HANA 2.0 ist die Verwendung der DML-Anweisungen INSERT, UPDATE und DELETE, die normalerweise für Datenbanktabellen verwendet werden, auch für Tabellenvariablen möglich. Um in den Anweisungen zwischen Datenbanktabellen und Tabellenvariablen zu unterscheiden, muss Letzeren der Doppelpunkt vorangestellt werden.

Der Inhalt einer Tabellenvariable darf entweder mit DML-Anweisungen bearbeitet werden oder mit den anderen vorgestellten Anweisungen, wie zum Beispiel durch Zuweisung, indexbasierten Zugriff oder die Tabellenoperatoren verändert werden. Beide Varianten sind mit der gleichen Tabellenvariable nicht möglich. Tabellenvariablen, die mit DML-Anweisungen verändert werden, nennen wir im Folgenden DML-Tabellenvariablen.

Deklaration von DML Tabellenvariablen

Das bedeutet auch, dass die Definition einer DML-Tabellenvariable nicht implizit über eine Zuweisung erfolgen darf. Stattdessen muss die DML-Tabellenvariable am Anfang eines Blocks mit DECLARE angelegt werden. Die Spaltendefinition erfolgt hier wie bei Datenbanktabellen, das bedeutet, dass Spalten auch als PRIMARY KEY markiert werden und es kann die Einschränkung NOT NULL für einzelne Spalten festgelegt werden. Folgend sehen Sie ein Beispiel für die Deklaration:

DECLARE lt_dml TABLE (vorname  NVARCHAR(30),
                      nachname NVARCHAR(30));

Um Daten in eine DML-Tabellenvariable einzufügen, müssen wir die INSERT-Anweisung verwenden:

INSERT INTO :lt_dml (SELECT vorname,
                            nachname
                       FROM benutzer);

Der lesende Zugriff auf DML-Tabellenvariablen mit einer SELECT-Abfrage funktioniert aber wie bei gewöhnlichen Tabellenvariablen:

SELECT *
  FROM :lt_dml;

Falls die gleichen Daten sowohl in DML-Tabellenvariablen mit DML-Anweisungen, als auch in normalen Tabellenvariablen mit den anderen Anweisungen verarbeitet werden sollen, müssen Sie diese von einer Variablen in die andere kopieren:

lt_normal = SELECT * FROM :lt_dml;

Quelle: SQLScript für SAP HANA, 2. Auflage

Fazit

Die neuen DML Tabellenvariablen sind super praktisch. Aber die Inkompatibilität zu den anderen Tabellenvariablen nervt. Vor allem die Inline Deklaration durch eine einfache Zuweisung vermisse ich bei dem neuen Konzept sehr.


  1. Data Manipulation Language