SAP HANA SQL-scripthandleiding: syntaxis en voorbeelden
⚡ Slimme samenvatting
SQL-script in SAP HANA breidt standaard SQL uit met functionele en procedurele constructies. Het biedt de basis voor opgeslagen procedures en door de gebruiker gedefinieerde functies, waardoor data-intensieve logica van de applicatieserver naar de database wordt verplaatst.

Wat is SQL-script?
SQL Script is een verzameling uitbreidingen voor SQL. Het kan worden gebruikt in een opgeslagen procedure in plaats van gewone SQL. Het bepaalt de functionele en procedurele uitbreidingen.
In SQL De scriptgebruiker kan lokale variabelen definiëren voor structuren en tabellen die voornamelijk worden gebruikt voor het maken van opgeslagen procedures.
SQL-script kan ook worden gebruikt in de berekeningsweergave. In SQL Script zijn er twee verschillende logische containers:
- Procedure (Met procedures kunt u een reeks gegevenstransformaties beschrijven op gegevens die zijn doorgegeven als invoer- en databasetabellen).
- Door de gebruiker gedefinieerde functie (de container met door de gebruiker gedefinieerde functie is gescheiden in een scalaire, door de gebruiker gedefinieerde functie en een door de gebruiker gedefinieerde tabelfunctie).
SQL Script Language-elementen zijn zoals hieronder:
Declaratieve SQL-scriptlogica (functionele extensie)
- Het maakt de definitie van tabeltypen mogelijk zonder te verwijzen naar databasetabellen.
- Typische verklaring zoals SELECT's.
- Functies van de berekeningsengine (CE).
⚠️ Versie-opmerking: De operators van het Calculation Engine-plan, de CE_-functies zoals CE_COLUMN_TABLE en CE_JOIN, zijn verouderd. SAPNieuwe ontwikkelingen moeten gebruikmaken van standaard SQL-instructies, die de optimizer minstens net zo goed verwerkt. Bestaande CE-code werkt nog steeds, maar moet worden gemigreerd wanneer een procedure de volgende keer wordt gewijzigd.
Orkestratie SQL-scriptlogica (functionele uitbreiding)
Orkestratielogica wordt gebruikt om de gegevensstroom te implementeren door gebruik te maken van DDL-, DML- en SQL-querystatements en om de stroomlogica te besturen met behulp van imperatieve taalconstructies zoals lussen en conditionals.
- Taaldefinitie van gegevensdefinitie. Maak bijvoorbeeld een schema.
- Taal voor gegevensmanipulatie (bijvoorbeeld invoegen).
Imperatieve SQL-scriptlogica (procedurele extensie)
Imperatieve logica verdeelt de logica over verschillende gegevensstromen. Bijvoorbeeld IF, ELSEIF, ELSE, CASE, FOR (lus) en uitzonderingen.
Belang van SQL-script
Alleen SQL Script biedt de benodigde elementen om gegevensintensieve logica of de werking van de applicatieserver naar de databaseserver te migreren.
Kernpunten van SQL-script
- SQL Script wordt uitgevoerd en verwerkt in de rekenmachine binnen de HANA-database.
- SQL Script kan complexe berekeningen uitvoeren.
- In SQL Script kan een lokale variabele worden gedeclareerd die het tussenresultaat bevat.
- SQL-scriptprocedure kan meer resultaten retourneren door de “OUTPUT-parameter” te gebruiken, terwijl de normale SQL-procedure er slechts één kan retourneren.
- In SQL Script kunt u globale of lokale tabeltypen definiëren die als parameters kunnen worden gebruikt.
Door gebruik te maken van SQL Script kan een parallelle verwerkingsmodus worden bereikt.
Voorbeeld van een SQL-scriptprocedure
Een procedure is de meest voorkomende container. Het onderstaande voorbeeld leest werknemersgegevens, filtert deze en retourneert het resultaat via een uitvoertabelparameter.
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;
Drie conventies zijn het vermelden waard. Elke variabele wordt voorafgegaan door een dubbele punt, dus :lt_all leest de tabelvariabele terwijl lt_all Aan de linkerkant wordt de waarde eraan toegewezen. READS SQL DATA vertelt de optimizer dat de procedure geen neveneffecten heeft, wat agressievere parallelisatie mogelijk maakt. En een procedure die meerdere uitvoerparameters retourneert, is precies de mogelijkheid die gewone SQL mist.
Het is heel eenvoudig om het zo te noemen:
CALL DHK_SCHEMA.GET_HIGH_EARNERS (50000, ?, ?);
Scalaire en tabelgebruikersgedefinieerde functies
Een procedure voert acties uit, terwijl een functie een waarde retourneert en binnen een query kan worden gebruikt. SQL Script biedt twee vormen die niet uitwisselbaar zijn.
| Parameter | Scalaire UDF | Tabel UDF |
|---|---|---|
| Retourneren | Een enkele waarde | Een resultaatset |
| Gebruikt in | SELECT-lijst, WHERE-clausule, expressies | De FROM-clausule is als een tabel. |
| Kan gegevens wijzigen | Nee | Nee |
| Typisch gebruik | Herbruikbare berekening, zoals een belastingtarief. | Geparameteriseerde weergave die gefilterde rijen retourneert |
-- 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;
Een tabelfunctie wordt gedefinieerd met RETURNS TABLE en wordt vervolgens opgevraagd in de FROM-clausule. Dit is de natuurlijke manier om een herbruikbare, geparameteriseerde dataset te bouwen die een berekeningsweergave of rapport kan worden verwerkt.
Best practices voor SQL-scripts
SQL-scripts presteren goed wanneer ze zo geschreven zijn dat de engine ze parallel kan verwerken, en slecht wanneer ze geschreven zijn als applicatiecode. Zes gewoontes maken het verschil.
- Geef de voorkeur aan declaratieve formuleringen boven imperatieve. Een enkele, op een set gebaseerde instructie presteert vaak vele malen beter dan een lus die rijen één voor één verwerkt. Gebruik een FOR-lus alleen wanneer de logica echt niet als een setbewerking kan worden uitgedrukt.
- Vermijd cursors. Ze dwingen tot verwerking rij voor rij en schakelen de rekenengine volledig uit. Vrijwel elke cursor kan worden herschreven als een join of een aggregatie.
- Houd de verklaringen onafhankelijk van elkaar. Twee tabelvariabelen die niet naar elkaar verwijzen, worden parallel berekend. Door elke stap aan de vorige te koppelen, wordt de hele procedure geserialiseerd.
- Declare READS SQL DATA where true. Het geeft aan dat de procedure geen bijwerkingen heeft, wat verdere optimalisatie mogelijk maakt.
- Filter zo vroeg mogelijk. Het verminderen van het aantal rijen in de eerste tabelvariabele verkleint alles wat daarop volgt, terwijl de kosten van het filteren aan het einde al zijn gemaakt.
- Stap over van CE_-functies. Ze zijn verouderd, kunnen niet zomaar met SQL in één statement worden gecombineerd en de SQL-optimizer voert dezelfde taken nu beter uit.
Syntaxis op statementniveau wordt behandeld in SAP HANA-SQLde functies die beschikbaar zijn binnen een procedure in SAP HANA SQL-functiesen de modelleringsobjecten die deze procedures gebruiken in de SAP HANA-modellering tutorial.
