SAP Урок за HANA SQL скрипт: Синтаксис и примери

⚡ Умно обобщение

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

  • 🧩 Основна дефиниция: Колекция от разширения на SQL, използвани в съхранени процедури вместо обикновени SQL оператори.
  • 📦 Два контейнера: Процедурите описват поредица от трансформации; потребителски дефинираните функции се предлагат в скаларна и таблична форма.
  • 🧠 Декларативна логика: Дефинира типове таблици без да се прави препратка към таблици в базата данни и издава обикновени SELECT оператори.
  • 🎼 Логика на оркестрацията: Реализира поток от данни с DDL, DML и заявки, плюс цикли и условни изрази.
  • 🔀 Императивна логика: Циклите IF, ELSEIF, ELSE, CASE, FOR и обработката на изключения разделят логиката между потоците от данни.
  • 📤 Множество изходи: SQL Script процедура връща няколко резултата чрез OUTPUT параметри, за разлика от обикновена SQL процедура.
  • Паралелно изпълнение: Независимите оператори се изпълняват паралелно от изчислителната машина.

SQL скрипт в SAP ХАНА

Какво е 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 скриптът се представя добре, когато е написан така, че да позволява на двигателя да се паралелизира, и зле, когато е написан като код на приложение. Шест навика правят разликата.

  1. Предпочитайте декларативното пред императивното наклонение. Един оператор, базиран на множество, превъзхожда цикъл, който обработва редове един по един, често с порядъци. Прибягвайте до FOR цикъл само когато логиката наистина не може да бъде изразена като операция с множество.
  2. Избягвайте курсорите. Те налагат обработка ред по ред и напълно обезсмислят изчислителната система. Почти всеки курсор може да бъде пренаписан като съединение или агрегация.
  3. Поддържайте изявленията независими. Две таблични променливи, които не се позовават една на друга, се изчисляват паралелно. Свързването на всяка стъпка с предишната сериализира цялата процедура.
  4. Декларирай ЧЕТЕНЕ НА SQL ДАННИ, където е true. Това сигнализира, че процедурата няма странични ефекти, което позволява по-голяма оптимизация.
  5. Филтрирайте възможно най-рано. Намаляването на броя на редовете в първата променлива на таблицата свива всичко надолу по веригата, докато филтрирането в края вече е платило цената.
  6. Мигрирайте от CE_ функциите. Те са остарели, не могат да се смесват свободно със SQL в един оператор и SQL оптимизаторът вече се справя по-добре със същата работа.

Синтаксисът на ниво оператор е разгледан в SAP HANA SQL, функциите, достъпни в рамките на процедурата в SAP HANA SQL функциии моделиращите обекти, които консумират тези процедури в SAP HANA моделиране настойнически.

Въпроси и Отговори

Двоеточието маркира четене на променливата. Записването ѝ без двоеточие отляво ѝ присвоява стойност, така че двете форми позволяват на парсера да различи присвояването от препратката.

Не. Операторите за план на изчислителната машина са остарели. Съществуващият код продължава да се изпълнява, но новите разработки трябва да използват стандартен SQL, който оптимизаторът вече обработва поне толкова добре.

Често да. Много FOR цикли и курсори изразяват съединение или агрегация, написани по-дълго, и изкуственият интелект може да предложи еквивалент, базиран на множество. Проверете дали броят на редовете съвпада, преди да го приемете.

Да. Четене на планаViz tracд., ИИ идентифицира оператора, който е изразходвал времето, и дали стъпките са били сериализирани поради ненужна зависимост между таблични променливи.

Да, чрез няколко параметъра на OUTPUT таблицата. Това е едно от основните предимства на SQL скрипта пред обикновена SQL процедура, която може да върне само един резултат.

Обобщете тази публикация с: