SAP HANA SQL-Skript-Tutorial: Syntax & Beispiele
⚡ Intelligente Zusammenfassung
SQL-Skript in SAP HANA erweitert Standard-SQL um funktionale und prozedurale Konstrukte. Es ermöglicht gespeicherte Prozeduren und benutzerdefinierte Funktionen und verlagert datenintensive Logik vom Anwendungsserver in die Datenbank.

Was ist SQL-Skript?
SQL Script ist eine Sammlung von Erweiterungen für SQL. Es kann in gespeicherten Prozeduren anstelle von einfachem SQL verwendet werden. Es legt die funktionalen und prozessualen Erweiterungen fest.
In SQL Skriptbenutzer können lokale Variablen für Strukturen und Tabellen definieren, die hauptsächlich zum Erstellen gespeicherter Prozeduren verwendet werden.
SQL-Skripte können auch in der Berechnungsansicht verwendet werden. In SQL Script gibt es zwei verschiedene Logikcontainer:
- Prozedur (Mit Prozeduren können Sie eine Abfolge von Datentransformationen für Daten beschreiben, die als Eingabe- und Datenbanktabellen übergeben werden.)
- Benutzerdefinierte Funktion (Der Container für benutzerdefinierte Funktionen ist in benutzerdefinierte Skalarfunktionen und benutzerdefinierte Tabellenfunktionen unterteilt.)
Die Elemente der SQL-Skriptsprache sind wie folgt:
Deklarative SQL-Skriptlogik (funktionale Erweiterung)
- Es ermöglicht die Definition von Tabellentypen ohne Referenzierung von Datenbanktabellen.
- Typische Anweisung wie SELECTs.
- Funktionen der Calculation Engine (CE).
⚠️ Versionshinweis: Die Planoperatoren der Berechnungs-Engine, die CE_-Funktionen wie CE_COLUMN_TABLE und CE_JOIN, sind veraltet durch SAPNeuentwicklungen sollten Standard-SQL-Anweisungen verwenden, die vom Optimierer mindestens genauso gut verarbeitet werden. Vorhandener CE-Code ist weiterhin lauffähig, sollte aber bei der nächsten Änderung einer Prozedur migriert werden.
Orchestrierungs-SQL-Skriptlogik (funktionale Erweiterung)
Orchestrierungslogik wird zur Implementierung des Datenflusses mithilfe von DDL-, DML- und SQL-Abfrageanweisungen und zur Steuerung der Flusslogik mithilfe zwingender Sprachkonstrukte wie Schleifen und Bedingungen verwendet.
- Erklärung zur Datendefinitionssprache. ZB Schema erstellen.
- Datenmanipulationssprache (z. B. Einfügen).
Imperative SQL-Skriptlogik (prozedurale Erweiterung)
Imperative Logik teilt die Logik auf mehrere Datenflüsse auf. Zum Beispiel IF, ELSEIF, ELSE, CASE, FOR (Schleife) und Ausnahmen.
Bedeutung von SQL-Skript
Nur SQL Script stellt die notwendigen Elemente bereit, um datenintensive Logik oder den Betrieb des Anwendungsservers auf den Datenbankserver zu migrieren.
Wichtige Punkte von SQL Script
- SQL-Skript wird in der Berechnungs-Engine innerhalb der HANA-Datenbank ausgeführt und verarbeitet.
- SQL Script kann komplexe Berechnungen durchführen.
- In SQL Script kann eine lokale Variable deklariert werden, um das Zwischenergebnis zu speichern.
- Eine SQL-Skriptprozedur kann durch die Verwendung des „OUTPUT-Parameters“ mehr Ergebnisse zurückgeben, während eine normale SQL-Prozedur nur eines zurückgeben kann.
- In SQL Script können Sie globale oder lokale Tabellentypen definieren, die als Parameter verwendet werden können.
Durch die Verwendung von SQL Script kann ein paralleler Verarbeitungsmodus erreicht werden.
Beispiel für eine SQL-Skriptprozedur
Eine Prozedur ist der gebräuchlichste Container. Das folgende Beispiel liest Mitarbeiterdaten, filtert sie und gibt das Ergebnis über einen Ausgabetabellenparameter zurück.
CREATE PROCEDURE DHK_SCHEMA.GET_HIGH_EARNERS ( IN im_min_salary DECIMAL(15,2), OUT ex_employees TABLE (EMP_NAME NVARCHAR(100), SALARY DECIMAL(15,2)), OUT ex_row_count INTEGER ) LANGUAGE SQLSCRIPT READS SQL DATA AS BEGIN -- Declarative logic: a table variable, not a physical table lt_all = SELECT EMP_NAME, SALARY FROM DHK_SCHEMA.EMPLOYEE WHERE SALARY >= :im_min_salary; -- Imperative logic: branch on the result SELECT COUNT(*) INTO ex_row_count FROM :lt_all; IF :ex_row_count = 0 THEN ex_employees = SELECT '' AS EMP_NAME, 0 AS SALARY FROM DUMMY WHERE 1 = 0; ELSE ex_employees = SELECT * FROM :lt_all ORDER BY SALARY DESC; END IF; END;
Drei Konventionen sind erwähnenswert. Ein Doppelpunkt steht vor jedem Lesevorgang einer Variablen, also :lt_all liest die Tabellenvariable während lt_all Links wird die Prozedur zugewiesen. READS SQL DATA signalisiert dem Optimierer, dass die Prozedur keine Seiteneffekte hat, was eine aggressivere Parallelisierung ermöglicht. Und eine Prozedur, die mehrere Ausgabeparameter zurückgibt, ist genau die Funktionalität, die reinem SQL fehlt.
Es ist ganz einfach:
CALL DHK_SCHEMA.GET_HIGH_EARNERS (50000, ?, ?);
Skalar- und Tabellen-Benutzerdefinierte Funktionen
Während eine Prozedur Aktionen ausführt, gibt eine Funktion einen Wert zurück und kann innerhalb einer Abfrage verwendet werden. SQL Script bietet zwei Formen, die nicht austauschbar sind.
| Parameter | Skalarer UDF | Tabellen-UDF |
|---|---|---|
| Rücksendungen | Ein einzelner Wert | Ein Ergebnissatz |
| Benutzt in | SELECT-Liste, WHERE-Klausel, Ausdrücke | Die FROM-Klausel ähnelt einer Tabelle. |
| Kann Daten ändern | Nein | Nein |
| Typische Verwendung | Wiederverwendbare Berechnungsformeln wie beispielsweise ein Steuersatz | Parametrisierte Ansicht, die gefilterte Zeilen zurückgibt |
-- Scalar function: returns one value CREATE FUNCTION DHK_SCHEMA.ADD_BONUS (im_salary DECIMAL(15,2)) RETURNS total DECIMAL(15,2) LANGUAGE SQLSCRIPT AS BEGIN total := :im_salary * 1.10; END; SELECT EMP_NAME, DHK_SCHEMA.ADD_BONUS(SALARY) AS WITH_BONUS FROM DHK_SCHEMA.EMPLOYEE;
Eine Tabellenfunktion wird mit RETURNS TABLE definiert und anschließend in der FROM-Klausel abgefragt. Dies ist die natürliche Methode, um einen wiederverwendbaren, parametrisierten Datensatz zu erstellen, der … Berechnungsansicht oder Bericht kann verbraucht werden.
Best Practices für SQL-Skripte
SQL-Skripte laufen optimal, wenn sie so geschrieben sind, dass die Engine sie parallelisieren kann, und schlecht, wenn sie wie Anwendungscode verfasst sind. Sechs Gewohnheiten machen den Unterschied.
- Deklarative Ausdrücke sind dem Imperativ vorzuziehen. Eine einzelne Mengenoperation ist einer Schleife, die Zeilen nacheinander verarbeitet, oft um Größenordnungen überlegen. Verwenden Sie eine FOR-Schleife nur dann, wenn sich die Logik tatsächlich nicht als Mengenoperation ausdrücken lässt.
- Vermeiden Sie Cursor. Sie erzwingen die zeilenweise Verarbeitung und setzen die Berechnungsengine vollständig außer Kraft. Nahezu jeder Cursor lässt sich als Join oder Aggregation umschreiben.
- Die Aussagen sollten voneinander unabhängig sein. Zwei Tabellenvariablen, die sich nicht gegenseitig referenzieren, werden parallel berechnet. Durch die Verkettung jedes einzelnen Schrittes mit dem vorherigen wird die gesamte Prozedur serialisiert.
- DECLARE READS SQL DATA WHERE true. Es signalisiert, dass das Verfahren keine Nebenwirkungen hat, was eine weitere Optimierung ermöglicht.
- Filtern Sie so früh wie möglich. Durch die Reduzierung der Zeilenanzahl in der ersten Tabellenvariablen wird alles nachgelagerte verkleinert, während die Filterung am Ende den Preis dafür bereits bezahlt hat.
- Weg von CE_-Funktionen. Sie sind veraltet, können nicht mehr frei mit SQL in einer einzigen Anweisung kombiniert werden, und der SQL-Optimierer erledigt dieselbe Aufgabe jetzt besser.
Die Syntax auf Anweisungsebene wird behandelt in SAP HANA SQL, die innerhalb einer Prozedur verfügbaren Funktionen in SAP HANA SQL-Funktionenund die Modellierungsobjekte, die diese Prozeduren in der SAP HANA-Modellierung Tutorial.
