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

Что такое SQL-скрипт?
SQL Script — это набор расширений SQL. Его можно использовать в хранимой процедуре вместо обычного SQL. Он определяет функциональные и процедурные расширения.
In SQL Пользователь сценария может определять локальные переменные для структуры и таблиц, которые в основном используются для создания хранимой процедуры.
Сценарий SQL также можно использовать в представлении вычислений. В SQL Script есть два разных логических контейнера:
- Процедура (Процедуры позволяют описать последовательность преобразований данных, передаваемых в виде входных данных и таблиц базы данных).
- Пользовательская функция (контейнер пользовательских функций разделен на скалярную пользовательскую функцию и табличную пользовательскую функцию).
Элементы языка SQL Script приведены ниже:
Декларативная логика SQL-скрипта (функциональное расширение)
- Это позволяет определять типы таблиц без ссылки на таблицы базы данных.
- Типичный оператор, подобный SELECT.
- Функции вычислительной машины (CE).
⚠️ Примечание к версии: Операторы плана вычислительного механизма, функции CE_, такие как CE_COLUMN_TABLE и CE_JOIN, устарели. SAPВ новых разработках следует использовать стандартные SQL-запросы, которые оптимизатор обрабатывает как минимум так же хорошо. Существующий код CE по-прежнему работает, но его следует перенести при следующем изменении процедуры.
Логика оркестрации SQL-скрипта (функциональное расширение)
Логика оркестровки используется для реализации потока данных с помощью операторов запросов DDL, DML и SQL, а логика потока управления — с использованием императивных языковых конструкций, таких как циклы и условные выражения.
- Положение о языке определения данных. Например, создать схему.
- Язык манипулирования данными (например, вставка).
Императивная логика SQL-скрипта (процедурное расширение)
Императивная логика разделяет логику между несколькими потоками данных. Например, ЕСЛИ, ELSEIF, ELSE, CASE, FOR (цикл) и исключения.
Важность SQL-скрипта
Только SQL Script предоставляет необходимые элементы для переноса логики с интенсивным использованием данных или работы сервера приложений на сервер базы данных.
Ключевые моменты SQL-скрипта
- 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 считывает переменную таблицы, пока lt_all Слева находится присваиваемый ей параметр. READS SQL DATA сообщает оптимизатору, что процедура не имеет побочных эффектов, что позволяет использовать более агрессивную параллелизацию. А возможность возврата процедурой нескольких выходных параметров — это именно то, чего не хватает обычному SQL.
Назвать это очень просто:
CALL DHK_SCHEMA.GET_HIGH_EARNERS (50000, ?, ?);
Скалярные и табличные пользовательские функции
В то время как процедура выполняет действия, функция возвращает значение и может использоваться внутри запроса. SQL Script предлагает две формы, и они не взаимозаменяемы.
| Параметр | Скалярная пользовательская функция | Таблица UDF |
|---|---|---|
| Returns | Одно значение | Набор результатов |
| Используется в | Список 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, использующий всего одно множество, зачастую на порядки превосходит цикл, обрабатывающий строки по одной. Используйте цикл FOR только тогда, когда логику действительно нельзя выразить как операцию над множеством.
- Избегайте использования курсоров. Они принудительно обрабатывают данные построчно и полностью сводят на нет работу вычислительного механизма. Практически любой курсор можно переписать как операцию объединения или агрегирования.
- Сохраняйте независимость высказываний. Вычисляются параллельно две табличные переменные, не ссылающиеся друг на друга. Последовательное выполнение каждого шага через предыдущий обеспечивает сериализацию всей процедуры.
- Объявите READS SQL DATA там, где значение равно true. Это свидетельствует об отсутствии побочных эффектов процедуры, что позволяет проводить дальнейшую оптимизацию.
- Фильтруйте как можно раньше. Уменьшение количества строк в первой переменной таблицы приводит к уменьшению всего последующего количества данных, тогда как фильтрация в конце уже окупила себя.
- Откажитесь от функций CE_. Они устарели, их нельзя свободно смешивать с SQL в одном запросе, и теперь оптимизатор SQL справляется с той же работой лучше.
Синтаксис на уровне операторов рассматривается в SAP Хана SQLфункции, доступные внутри процедуры в SAP Функции SQL HANAа также объекты моделирования, которые используют эти процедуры в SAP Моделирование HANA учебное пособие.
