SAP Samouczek skryptu HANA SQL: składnia i przykłady
⚡ Inteligentne podsumowanie
Skrypt SQL w SAP HANA rozszerza standardowy SQL o konstrukcje funkcjonalne i proceduralne. Obsługuje procedury składowane i funkcje definiowane przez użytkownika, przenosząc logikę intensywnie wykorzystującą dane z serwera aplikacji do bazy danych.

Co to jest skrypt SQL?
SQL Script to zbiór rozszerzeń języka SQL. Można go używać w procedurze składowanej zamiast zwykłego SQL. Określa rozszerzenia funkcjonalne i proceduralne.
In SQL Użytkownik skryptu może definiować zmienne lokalne dla struktur i tabel, które są wykorzystywane przede wszystkim do tworzenia procedur składowanych.
Skrypt SQL może być również używany w widoku Obliczenia. W skrypcie SQL istnieją dwa różne kontenery logiczne -
- Procedura (Procedury umożliwiają opisanie sekwencji przekształceń danych na danych przekazywanych jako tabele wejściowe i bazy danych).
- Funkcja zdefiniowana przez użytkownika (kontener funkcji zdefiniowanej przez użytkownika jest podzielony na funkcję skalarną zdefiniowaną przez użytkownika i funkcję zdefiniowaną przez użytkownika w formie tabeli).
Elementy języka skryptowego SQL są następujące –
Deklaratywna logika skryptu SQL (rozszerzenie funkcjonalne)
- Umożliwia definiowanie typów tabel bez odwoływania się do tabel bazy danych.
- Typowe instrukcje, takie jak SELECT.
- Funkcje silnika obliczeniowego (CE).
⚠️ Uwaga dotycząca wersji: Operatorzy planu silnika obliczeniowego, funkcje CE_, takie jak CE_COLUMN_TABLE i CE_JOIN, są przestarzałe SAPNowe rozwiązania powinny wykorzystywać standardowe instrukcje SQL, które optymalizator obsługuje co najmniej równie dobrze. Istniejący kod CE nadal działa, ale powinien zostać zmigrowany przy kolejnej zmianie procedury.
Orkiestracyjna logika skryptu SQL (rozszerzenie funkcjonalne)
Logika orkiestracji służy do implementowania przepływu danych przy użyciu instrukcji DDL, DML i zapytań SQL oraz logiki przepływu sterowania przy użyciu imperatywnych konstrukcji języka, takich jak pętle i warunki.
- Oświadczenie dotyczące języka definicji danych. Np. Utwórz schemat.
- Język manipulacji danymi (np. wstawianie).
Imperatywna logika skryptu SQL (rozszerzenie proceduralne)
Logika imperatywna dzieli logikę na kilka przepływów danych. Np. JEŻELI, ELSEIF, ELSE, CASE, FOR (pętla) i wyjątki.
Znaczenie skryptu SQL
Tylko SQL Script zapewnia niezbędne elementy do migracji logiki intensywnie korzystającej z danych lub działania serwera aplikacji na serwer bazy danych.
Kluczowe punkty skryptu SQL
- Skrypt SQL jest wykonywany i przetwarzany w silniku obliczeniowym w bazie danych HANA.
- Skrypt SQL umożliwia wykonywanie złożonych obliczeń.
- W skrypcie SQL można zadeklarować zmienną lokalną przechowującą wynik tymczasowy.
- Procedura skryptu SQL może zwrócić więcej wyników, używając „parametru WYJŚCIOWEGO”, podczas gdy normalna procedura SQL może zwrócić tylko jeden.
- W skrypcie SQL można zdefiniować globalne lub lokalne typy tabel, których można używać jako parametrów.
Używając skryptu SQL, można osiągnąć tryb przetwarzania równoległego.
Przykład procedury skryptu SQL
Procedura to najpopularniejszy kontener. Poniższy przykład odczytuje dane pracowników, filtruje je i zwraca wynik za pomocą parametru tabeli wyjściowej.
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;
Warto zwrócić uwagę na trzy konwencje. Dwukropek poprzedza każdy odczyt zmiennej, więc :lt_all odczytuje zmienną tabeli podczas lt_all Po lewej stronie przypisuje do niego. READS SQL DATA informuje optymalizator, że procedura nie ma efektów ubocznych, co pozwala na bardziej agresywną paralelizację. A procedura zwracająca kilka parametrów wyjściowych to dokładnie ta funkcja, której brakuje w zwykłym SQL.
Nazwanie tego jest proste:
CALL DHK_SCHEMA.GET_HIGH_EARNERS (50000, ?, ?);
Skalarne i tabelaryczne funkcje zdefiniowane przez użytkownika
Gdy procedura wykonuje akcje, funkcja zwraca wartość i może być używana w zapytaniu. Skrypt SQL oferuje dwie formy, które nie są zamienne.
| Parametr | Skalarny UDF | Tabela UDF |
|---|---|---|
| Zwroty | Pojedyncza wartość | Zestaw wyników |
| Stosuje się w | Lista SELECT, klauzula WHERE, wyrażenia | Klauzula FROM, jak tabela |
| Możliwość modyfikacji danych | Nie | Nie |
| Typowe zastosowanie | Wielokrotnego użytku obliczenia, takie jak stawka podatku | Widok sparametryzowany zwracający przefiltrowane wiersze |
-- 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;
Funkcja tabelaryczna jest definiowana za pomocą RETURNS TABLE, a następnie jest ona kwerendowana w klauzuli FROM, co sprawia, że jest to naturalny sposób tworzenia wielokrotnego użytku, sparametryzowanego zestawu danych, który widok obliczeniowy lub raport może zużyć.
Najlepsze praktyki dotyczące skryptów SQL
Skrypt SQL działa dobrze, gdy jest napisany tak, aby umożliwić silnikowi paralelizację, a źle, gdy jest napisany jak kod aplikacji. Sześć nawyków robi różnicę.
- Wolę formę deklaratywną od rozkazującej. Pojedyncza instrukcja oparta na zbiorze przewyższa pętlę przetwarzającą wiersze pojedynczo, często o rzędy wielkości. Po pętlę FOR sięgaj tylko wtedy, gdy logiki naprawdę nie da się wyrazić jako operacji na zbiorze.
- Unikaj kursorów. Wymuszają przetwarzanie wiersz po wierszu i całkowicie ignorują silnik obliczeniowy. Prawie każdy kursor można zapisać jako łączenie lub agregację.
- Zachowaj niezależność oświadczeń. Dwie zmienne tabelowe, które nie odwołują się do siebie, są obliczane równolegle. Łączenie każdego kroku z poprzednim powoduje serializację całej procedury.
- Zadeklaruj READS SQL DATA, jeśli wartość jest true. Sygnalizuje to, że zabieg nie powoduje skutków ubocznych, co pozwala na większą optymalizację.
- Przefiltruj jak najwcześniej. Zmniejszenie liczby wierszy w pierwszej zmiennej tabeli powoduje zmniejszenie wszystkich dalszych elementów, natomiast filtrowanie na końcu już wiąże się z pewnymi kosztami.
- Zrezygnuj z funkcji CE_. Są one przestarzałe, nie można ich dowolnie mieszać z SQL w jednym poleceniu, a optymalizator SQL teraz lepiej radzi sobie z tym samym zadaniem.
Składnia na poziomie instrukcji jest omówiona w SAP HANA SQL, funkcje dostępne wewnątrz procedury w SAP Funkcje HANA SQLi obiektów modelowania, które wykorzystują te procedury w SAP Modelowanie HANA poradnik.
