SAP Výukový program pro skripty HANA SQL: Syntaxe a příklady

⚡ Chytré shrnutí

SQL skript v SAP HANA rozšiřuje standardní SQL o funkční a procedurální konstrukty. Pomáhá uložit procedury a uživatelem definované funkce a přesouvá logiku náročnou na data z aplikačního serveru do databáze.

  • 🧩 Základní definice: Soubor rozšíření SQL používaných v uložených procedurách místo prostých příkazů SQL.
  • ???? Dva kontejnery: Procedury popisují posloupnost transformací; uživatelem definované funkce se dodávají ve skalární a tabulkové formě.
  • 🧠 Deklarativní logika: Definuje typy tabulek bez odkazování na databázové tabulky a vydává běžné příkazy SELECT.
  • 🎼 Logika orchestrace: Implementuje tok dat pomocí DDL, DML a dotazovacích příkazů plus smyček a podmíněných výrazů.
  • 🔀 Imperativní logika: Smyčky IF, ELSEIF, ELSE, CASE, FOR a ošetření výjimek rozdělují logiku mezi datové toky.
  • 📤 Více výstupů: Procedura SQL skriptu vrací několik výsledků prostřednictvím výstupních parametrů, na rozdíl od prosté procedury SQL.
  • ⚡ Paralelní provedení: Nezávislé příkazy jsou výpočetním enginem prováděny paralelně.

SQL skript v SAP HANA

Co je SQL Script?

SQL Script je kolekce rozšíření SQL. Lze jej použít v uložené proceduře místo prostého SQL. Určuje funkční a procedurální rozšíření.

In SQL Uživatel skriptu může definovat lokální proměnné pro strukturu a tabulky, které se primárně používají pro tvorbu uložené procedury.

SQL skript lze také použít v zobrazení Výpočet. Ve skriptu SQL existují dva různé logické kontejnery-

  • Procedura (Procedury umožňují popsat sekvenci transformací dat na datech předávaných jako vstupní a databázové tabulky).
  • User Defined Function (Kontejner User Defined Function je rozdělen na skalární uživatelem definovanou funkci a tabulku uživatelem definovanou funkci).

Prvky skriptovacího jazyka SQL jsou uvedeny níže –

Deklarativní logika skriptu SQL (funkční rozšíření)

  • Umožňuje definici typů tabulek bez odkazování na databázové tabulky.
  • Typický příkaz jako SELECTs.
  • Funkce výpočetního motoru (CE).

⚠️ Poznámka k verzi: Operátory plánu výpočetního enginu, funkce CE_, jako například CE_COLUMN_TABLE a CE_JOIN, jsou zastaralé. SAPNový vývoj by měl používat standardní SQL příkazy, které optimalizátor zvládá alespoň stejně dobře. Stávající CE kód stále běží, ale měl by být migrován při příští změně procedury.

Orchestration SQL Script Logic (funkční rozšíření)

Orchestrační logika se používá k implementaci toku dat pomocí příkazů DDL, DML a SQL Query a logiky řízení toku pomocí imperativních jazykových konstrukcí, jako jsou smyčky a podmínky.

  • Prohlášení jazyka definice dat. Např. Vytvořte schéma.
  • Jazyk pro manipulaci s daty (např. Insert).

Imperativní logika skriptu SQL (procedurální rozšíření)

Imperativní logika rozděluje logiku mezi několik datových toků. Např. IF, ELSEIF, ELSE, CASE, FOR (smyčka) a výjimky.

Význam SQL skriptu

Pouze SQL Script poskytuje nezbytné prvky pro migraci datově náročné logiky nebo provozu aplikačního serveru na databázový server.

Klíčové body SQL skriptu

  • SQL Script se spouští a zpracovává ve výpočetním enginu v databázi HANA.
  • SQL Script je schopen provádět složité výpočty.
  • Ve skriptu SQL lze deklarovat lokální proměnnou, která bude obsahovat prozatímní výsledek.
  • Procedura skriptu SQL může vrátit více výsledků pomocí „parametru VÝSTUPU“, zatímco normální procedura SQL může vrátit pouze jeden.
  • V SQL skriptu můžete definovat globální nebo lokální typy tabulek, které lze použít jako parametry.

Pomocí skriptu SQL lze dosáhnout režimu paralelního zpracování.

Příklad procedury SQL skriptu

Procedura je nejběžnějším kontejnerem. Následující příklad čte data zaměstnanců, filtruje je a vrací výsledek pomocí parametru výstupní tabulky.

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;

Za zmínku stojí tři konvence. Dvojtečka začíná před jakýmkoli čtením proměnné, takže :lt_all čte proměnnou tabulky, zatímco vše vlevo mu přiřazuje. READS SQL DATA říká optimalizátoru, že procedura nemá žádné vedlejší účinky, což umožňuje agresivnější paralelizaci. A procedura vracející několik výstupních parametrů je přesně ta schopnost, kterou prostý SQL postrádá.

Volání je jednoduché:

CALL DHK_SCHEMA.GET_HIGH_EARNERS (50000, ?, ?);

Skalární a tabulkové uživatelsky definované funkce

Pokud procedura provádí akce, funkce vrací hodnotu a lze ji použít v dotazu. SQL skript nabízí dva formáty a ty nejsou zaměnitelné.

Parametr Skalární UDF Tabulka UDF
Vrácení zboží Jedna hodnota Sada výsledků
Použito v Seznam SELECT, klauzule WHERE, výrazy Klauzule FROM, podobně jako tabulka
Může upravovat data Ne Ne
Typické použití Opakovaně použitelný výpočet, například daňová sazba Parametrizované zobrazení vracející filtrované řádky
-- 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;

Tabulková funkce je definována pomocí RETURNS TABLE a poté je dotazována v klauzuli FROM, což z ní činí přirozený způsob, jak vytvořit opakovaně použitelnou, parametrizovanou datovou sadu, která... zobrazení výpočtu nebo sestava může spotřebovat.

Nejlepší postupy pro SQL skripty

SQL skript funguje dobře, když je napsán tak, aby umožňoval paralelizaci enginu, a špatně, když je napsán jako aplikační kód. Rozdíl spočívá v šesti návycích.

  1. Upřednostňujte deklarativní způsob před imperativním. Jeden příkaz založený na množině překonává smyčku, která zpracovává řádky jeden po druhém, často o řády. Po smyčce FOR sahejte pouze tehdy, když logiku skutečně nelze vyjádřit jako operaci s množinami.
  2. Vyhněte se kurzorům. Vynucují zpracování řádek po řádku a zcela ruší výpočetní engine. Téměř každý kurzor lze přepsat jako spojení nebo agregaci.
  3. Udržujte výroky nezávislé. Dvě proměnné tabulky, které se na sebe navzájem neodkazují, se počítají paralelně. Řetězení každého kroku s předchozím serializuje celou proceduru.
  4. Deklarujte ČTENÍ SQL DATA, kde je hodnota true. Signalizuje to, že postup nemá žádné vedlejší účinky, což umožňuje větší optimalizaci.
  5. Filtrujte co nejdříve. Snížení počtu řádků v první proměnné tabulky zmenší vše v následných proměnných, zatímco filtrování na konci již zaplatilo za to.
  6. Migrujte pryč z funkcí CE_. Jsou zastaralé, nelze je volně kombinovat s SQL v jednom příkazu a optimalizátor SQL nyní zvládá stejnou práci lépe.

Syntaxe na úrovni příkazů je popsána v SAP HANA SQL, funkce dostupné uvnitř procedury v SAP Funkce HANA SQLa modelovací objekty, které tyto procedury spotřebovávají v SAP Modelování HANA výukový program.

Nejčastější dotazy

Dvojtečka označuje čtení proměnné. Zápis bez dvojtečky vlevo jí přiřazuje hodnotu, takže tyto dva tvary umožňují analyzátoru rozlišit přiřazení od odkazu.

Ne. Operátory plánu Výpočetního enginu jsou zastaralé. Stávající kód bude i nadále běžet, ale nový vývoj by měl používat standardní SQL, který optimalizátor nyní zvládá přinejmenším stejně dobře.

Často ano. Mnoho smyček FOR a kurzorů vyjadřuje spojení nebo agregaci zapsanou delším způsobem a umělá inteligence může navrhnout ekvivalent založený na množině. Před jeho přijetím ověřte, zda se počet řádků shoduje.

Ano. Čtení plánuViz tracE. AI identifikuje příkaz spotřebovávající čas a zda byly kroky serializovány zbytečnou závislostí mezi proměnnými tabulky.

Ano, prostřednictvím několika parametrů tabulky OUTPUT. To je jedna z hlavních výhod SQL skriptu oproti obyčejné SQL procedure, která může vrátit pouze jeden výsledek.

Shrňte tento příspěvek takto: