SAP Урок за HANA SQL скрипт: Синтаксис и примери
⚡ Умно обобщение
SQL скрипт в SAP HANA разширява стандартния SQL с функционални и процедурни конструкции. Тя захранва съхранените процедури и потребителски дефинираните функции, премествайки логиката, изискваща интензивно обработване на данни, от сървъра на приложенията в базата данни.

Какво е SQL скрипт?
SQL Script е колекция от разширения на SQL. Може да се използва в съхранена процедура вместо обикновен SQL. Той определя функционалните и процедурните разширения.
In SQL Потребителят на скрипт може да дефинира локални променливи за структура и таблици, които се използват основно за създаване на съхранена процедура.
SQL скриптът може да се използва и в изглед на изчисление. В SQL Script има два различни логически контейнера-
- Процедура (Процедурите ви позволяват да опишете последователност от трансформации на данни върху данни, предадени като вход и таблици на база данни).
- Дефинирана от потребителя функция (Контейнерът за дефинирана от потребителя функция е разделен на скаларна дефинирана от потребителя функция и таблична дефинирана от потребителя функция).
Елементите на SQL Script Language са както следва –
Декларативна логика на SQL скрипт (функционално разширение)
- Позволява дефинирането на типове таблици без препращане към таблици на база данни.
- Типичен израз като SELECT.
- Функции на изчислителната машина (CE).
⚠️ Бележка към версията: Операторите на плана на изчислителния механизъм, функциите CE_, като CE_COLUMN_TABLE и CE_JOIN, са остарели от SAPНовата разработка трябва да използва стандартни SQL оператори, които оптимизаторът обработва поне толкова добре. Съществуващият CE код все още работи, но трябва да бъде мигриран при следващата промяна на процедурата.
Orchestration SQL Script Logic (функционално разширение)
Логиката на оркестрацията се използва за реализиране на поток от данни чрез използване на DDL, DML и SQL оператори за заявки и контрол на логиката на потока чрез императивни езикови конструкции като цикли и условни изрази.
- Езикова декларация за дефиниране на данни. Например Създаване на схема.
- Език за манипулиране на данни (напр. Insert).
Императивна логика на SQL скрипт (процедурно разширение)
Императивната логика разделя логиката между няколко потока от данни. Например IF, ELSEIF, ELSE, CASE, FOR (цикъл) и изключения.
Значение на SQL скрипта
Само SQL Script осигурява необходимите елементи за мигриране на логиката с интензивно използване на данни или работата на сървъра на приложения към сървъра на базата данни.
Ключови точки на SQL Script
- SQL скриптът се изпълнява и обработва в изчислителната машина в базата данни HANA.
- SQL Script може да извършва сложни изчисления.
- В SQL Script може да се декларира локална променлива, която да съхранява междинния резултат.
- Процедурата на SQL скрипт може да върне повече резултати, като използва „OUTPUT Parameter“, докато нормалната SQL процедура може да върне само един.
- В SQL Script можете да дефинирате глобални или локални типове таблици, които могат да се използват като параметри.
С помощта на SQL Script може да се постигне режим на паралелна обработка.
Пример за процедура на SQL скрипт
Процедурата е най-често срещаният контейнер. Примерът по-долу чете данни за служителите, филтрира ги и връща резултата чрез параметър на изходна таблица.
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;
Струва си да се отбележат три конвенции. Двоеточие поставя пред всяко четене на променлива, така че :lt_all чете табличната променлива, докато всичко отляво му присвоява. READS SQL DATA казва на оптимизатора, че процедурата няма странични ефекти, което позволява по-агресивна паралелизация. А процедура, връщаща няколко изходни параметъра, е точно тази възможност, която липсва на обикновения SQL.
Извикването му е лесно:
CALL DHK_SCHEMA.GET_HIGH_EARNERS (50000, ?, ?);
Скаларни и таблични потребителски дефинирани функции
Когато процедура извършва действия, функцията връща стойност и може да се използва в заявка. SQL скриптът предлага две форми и те не са взаимозаменяеми.
| Параметър | Скаларна UDF | Таблица UDF |
|---|---|---|
| Връщане | Една единствена стойност | Набор от резултати |
| Използвано в | SELECT списък, WHERE клауза, изрази | Клаузата FROM, подобно на таблица |
| Може да променя данни | Не | Не |
| Типична употреба | Многократно използваемо изчисление, като например данъчна ставка | Параметризиран изглед, връщащ филтрирани редове |
-- 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;
Таблична функция се дефинира с RETURNS TABLE и след това се запитва към нея в клаузата FROM, което я прави естествен начин за изграждане на многократно използваем, параметризиран набор от данни, който изглед на изчислението или отчетът може да консумира.
Най-добри практики за SQL скриптове
SQL скриптът се представя добре, когато е написан така, че да позволява на двигателя да се паралелизира, и зле, когато е написан като код на приложение. Шест навика правят разликата.
- Предпочитайте декларативното пред императивното наклонение. Един оператор, базиран на множество, превъзхожда цикъл, който обработва редове един по един, често с порядъци. Прибягвайте до FOR цикъл само когато логиката наистина не може да бъде изразена като операция с множество.
- Избягвайте курсорите. Те налагат обработка ред по ред и напълно обезсмислят изчислителната система. Почти всеки курсор може да бъде пренаписан като съединение или агрегация.
- Поддържайте изявленията независими. Две таблични променливи, които не се позовават една на друга, се изчисляват паралелно. Свързването на всяка стъпка с предишната сериализира цялата процедура.
- Декларирай ЧЕТЕНЕ НА SQL ДАННИ, където е true. Това сигнализира, че процедурата няма странични ефекти, което позволява по-голяма оптимизация.
- Филтрирайте възможно най-рано. Намаляването на броя на редовете в първата променлива на таблицата свива всичко надолу по веригата, докато филтрирането в края вече е платило цената.
- Мигрирайте от CE_ функциите. Те са остарели, не могат да се смесват свободно със SQL в един оператор и SQL оптимизаторът вече се справя по-добре със същата работа.
Синтаксисът на ниво оператор е разгледан в SAP HANA SQL, функциите, достъпни в рамките на процедурата в SAP HANA SQL функциии моделиращите обекти, които консумират тези процедури в SAP HANA моделиране настойнически.
