SAP Учебное пособие по SQL-скриптам HANA: синтаксис и примеры.

⚡ Умное резюме

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

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

SQL-скрипт в SAP HANA

Что такое 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-скрипты работают хорошо, если написаны с учетом возможности распараллеливания вычислений, и плохо, если написаны как код приложения. Шесть привычек имеют решающее значение.

  1. Предпочтительнее декларативный стиль, чем императивный. Оператор FOR, использующий всего одно множество, зачастую на порядки превосходит цикл, обрабатывающий строки по одной. Используйте цикл FOR только тогда, когда логику действительно нельзя выразить как операцию над множеством.
  2. Избегайте использования курсоров. Они принудительно обрабатывают данные построчно и полностью сводят на нет работу вычислительного механизма. Практически любой курсор можно переписать как операцию объединения или агрегирования.
  3. Сохраняйте независимость высказываний. Вычисляются параллельно две табличные переменные, не ссылающиеся друг на друга. Последовательное выполнение каждого шага через предыдущий обеспечивает сериализацию всей процедуры.
  4. Объявите READS SQL DATA там, где значение равно true. Это свидетельствует об отсутствии побочных эффектов процедуры, что позволяет проводить дальнейшую оптимизацию.
  5. Фильтруйте как можно раньше. Уменьшение количества строк в первой переменной таблицы приводит к уменьшению всего последующего количества данных, тогда как фильтрация в конце уже окупила себя.
  6. Откажитесь от функций CE_. Они устарели, их нельзя свободно смешивать с SQL в одном запросе, и теперь оптимизатор SQL справляется с той же работой лучше.

Синтаксис на уровне операторов рассматривается в SAP Хана SQLфункции, доступные внутри процедуры в SAP Функции SQL HANAа также объекты моделирования, которые используют эти процедуры в SAP Моделирование HANA учебное пособие.

Часто задаваемые вопросы (FAQ)

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

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

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

Да. Ознакомление с планом.Viz tracНапример, ИИ определяет оператор, потребляющий время, и выясняет, были ли шаги последовательно выполнены из-за ненужной зависимости между переменными таблицы.

Да, через несколько параметров выходной таблицы. Это одно из главных преимуществ SQL-скрипта по сравнению с обычной SQL-процедурой, которая может возвращать только один результат.

Подведем итог этой публикации следующим образом: