SAP Підручник зі скриптів HANA SQL: синтаксис та приклади
⚡ Розумний підсумок
SQL-скрипт у SAP HANA розширює стандартний SQL функціональними та процедурними конструкціями. Вона забезпечує збережені процедури та користувацькі функції, переносячи логіку, що вимагає інтенсивної обробки даних, із сервера застосунків у базу даних.

Що таке SQL Script?
SQL Script — це набір розширень SQL. Його можна використовувати в збереженій процедурі замість звичайного SQL. Він визначає функціональні та процедурні розширення.
In SQL Користувач сценарію може визначати локальні змінні для структури та таблиць, які в основному використовуються для створення збереженої процедури.
Сценарій SQL також можна використовувати в режимі обчислення. У SQL Script є два різних логічних контейнера -
- Процедура (Процедури дозволяють описати послідовність перетворень даних щодо даних, що передаються як вхідні дані та таблиці бази даних).
- Функція, визначена користувачем (контейнер функції, визначеної користувачем, розділений на скалярну функцію, визначену користувачем, і функцію таблиці, визначену користувачем).
Елементи SQL Script Language:
Логіка декларативного сценарію SQL (функціональне розширення)
- Це дозволяє визначати типи таблиць без посилань на таблиці бази даних.
- Типовий оператор, як SELECT.
- Функції механізму обчислення (CE).
⚠️ Примітка до версії: Оператори плану обчислювального механізму, функції CE_, такі як CE_COLUMN_TABLE та CE_JOIN, є застарілими SAPНові розробки повинні використовувати стандартні SQL-запитувачі, які оптимізатор обробляє щонайменше так само добре. Існуючий CE-код все ще працює, але його слід перенести під час наступної зміни процедури.
Оркестровка SQL Script Logic (функціональне розширення)
Логіка оркестровки використовується для реалізації потоку даних за допомогою інструкцій запитів DDL, DML і SQL і керування логікою потоку за допомогою імперативних мовних конструкцій, таких як цикли та умови.
- Заява мови визначення даних. Наприклад, створити схему.
- Мова маніпулювання даними (наприклад, вставка).
Імперативна логіка сценарію SQL (процедурне розширення)
Імперативна логіка розділяє логіку між кількома потоками даних. Наприклад, IF, ELSEIF, ELSE, CASE, FOR (цикл) і винятки.
Важливість SQL Script
Лише SQL Script надає необхідні елементи для перенесення логіки, що потребує великих даних, або роботи сервера додатків на сервер бази даних.
Ключові моменти SQL Script
- Сценарій SQL виконується та обробляється в системі обчислень у базі даних HANA.
- SQL Script здатний виконувати складні обчислення.
- У SQL Script локальна змінна може бути оголошена для зберігання проміжного результату.
- Процедура сценарію SQL може повернути більше результатів за допомогою «ВИВІДНОГО параметра», тоді як звичайна процедура 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 навчальний посібник.
