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.

  • 🧩 Kerndefinitie: Een verzameling SQL-extensies die binnen opgeslagen procedures worden gebruikt in plaats van gewone SQL-instructies.
  • ???? Twee containers: Procedures beschrijven een reeks transformaties; door de gebruiker gedefinieerde functies zijn beschikbaar in scalaire en tabelvorm.
  • ???? Declaratieve logica: Definieert tabeltypen zonder te verwijzen naar databasetabellen en voert gewone SELECT-instructies uit.
  • 🎼 Orchestratielogica: Implementeert dataflow met DDL-, DML- en query-instructies, plus lussen en voorwaardelijke instructies.
  • 🔀 Imperatieve logica: IF-, ELSEIF-, ELSE-, CASE- en FOR-lussen, en foutafhandeling verdelen de logica over verschillende gegevensstromen.
  • 📤 Meerdere uitgangen: Een SQL-scriptprocedure retourneert meerdere resultaten via OUTPUT-parameters, in tegenstelling tot een gewone SQL-procedure.
  • ⚡ Parallelle uitvoering: De rekenmachine voert de afzonderlijke instructies parallel uit.

SQL-script in SAP HANA

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.

  1. 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.
  2. 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.
  3. 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.
  4. Declare READS SQL DATA where true. Het geeft aan dat de procedure geen bijwerkingen heeft, wat verdere optimalisatie mogelijk maakt.
  5. 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.
  6. 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.

Veelgestelde vragen

De dubbele punt geeft aan dat de variabele gelezen moet worden. Als je de variabele zonder dubbele punt links schrijft, wordt er een waarde aan toegewezen. De twee vormen stellen de parser dus in staat om toewijzing van verwijzing te onderscheiden.

Nee. De planoperators van de Calculation Engine zijn verouderd. Bestaande code blijft werken, maar nieuwe ontwikkelingen moeten gebruikmaken van standaard SQL, dat de optimizer nu minstens net zo goed verwerkt.

Vaak wel. Veel FOR-lussen en cursors drukken een join of aggregatie uit op een omslachtige manier, terwijl AI een op sets gebaseerd equivalent kan voorstellen. Controleer of het aantal rijen overeenkomt voordat u het overneemt.

Ja. Het plan lezen.Viz trace, AI identificeert de instructie die de meeste tijd in beslag neemt en of stappen zijn geserialiseerd door een onnodige afhankelijkheid tussen tabelvariabelen.

Ja, via meerdere uitvoertabelparameters. Dit is een van de belangrijkste voordelen van een SQL-script ten opzichte van een gewone SQL-procedure, die slechts één resultaat kan retourneren.

Vat dit bericht samen met: