SAP Tutorial de scripts SQL para HANA: Sintaxis y ejemplos
⚡ Resumen inteligente
Script SQL en SAP HANA amplía el SQL estándar con construcciones funcionales y procedimentales. Permite el uso de procedimientos almacenados y funciones definidas por el usuario, trasladando la lógica intensiva en datos del servidor de aplicaciones a la base de datos.

¿Qué es la secuencia de comandos SQL?
SQL Script es una colección de extensiones de SQL. Se puede utilizar en un procedimiento almacenado en lugar de SQL simple. Determina las prórrogas funcionales y procesales.
In SQL El usuario del script puede definir variables locales para estructuras y tablas que se utilizan principalmente para la creación de procedimientos almacenados.
El script SQL también se puede utilizar en la vista de cálculo. En SQL Script, hay dos contenedores lógicos diferentes:
- Procedimiento (Los procedimientos le permiten describir una secuencia de transformaciones de datos en los datos pasados como tablas de entrada y de base de datos).
- Función definida por el usuario (el contenedor de función definida por el usuario se separa en función escalar definida por el usuario y función de tabla definida por el usuario).
Los elementos del lenguaje de secuencia de comandos SQL son los siguientes:
Lógica de script SQL declarativa (extensión funcional)
- Permite la definición de tipos de tablas sin hacer referencia a tablas de bases de datos.
- Declaración típica como SELECT.
- Funciones del motor de cálculo (CE).
⚠️ Nota de versión: Los operadores de planes del motor de cálculo, las funciones CE_ como CE_COLUMN_TABLE y CE_JOIN, están obsoletos. SAPEl nuevo desarrollo debe usar sentencias SQL estándar, que el optimizador maneja igual de bien. El código CE existente sigue funcionando, pero debe migrarse la próxima vez que se modifique un procedimiento.
Lógica de script SQL de orquestación (extensión funcional)
La lógica de orquestación se utiliza para implementar el flujo de datos mediante DDL, DML y declaraciones de consulta SQL y controlar la lógica de flujo mediante construcciones de lenguaje imperativos, como bucles y condicionales.
- Declaración del lenguaje de definición de datos. P.ej. Crear esquema.
- Lenguaje de manipulación de datos (por ejemplo, insertar).
Lógica de script SQL imperativa (extensión de procedimiento)
La lógica imperativa divide la lógica entre varios flujos de datos. P.ej. IF, ELSEIF, ELSE, CASE, FOR (Bucle) y Excepciones.
Importancia del script SQL
Sólo SQL Script proporciona los elementos necesarios para migrar la lógica con uso intensivo de datos o el funcionamiento del servidor de aplicaciones al servidor de bases de datos.
Puntos clave del script SQL
- SQL Script se ejecuta y procesa en el motor de cálculo dentro de la base de datos HANA.
- SQL Script puede realizar cálculos complejos.
- En SQL Script, se puede declarar una variable local para contener el resultado provisional.
- El procedimiento de secuencia de comandos SQL puede devolver más resultados utilizando el "parámetro de SALIDA", mientras que el procedimiento SQL normal puede devolver solo uno.
- En SQL Script, puede definir tipos de tablas globales o locales que se pueden utilizar como parámetros.
Al utilizar SQL Script, se puede lograr el modo de procesamiento paralelo.
Ejemplo de procedimiento de script SQL
Un procedimiento es el contenedor más común. El siguiente ejemplo lee datos de empleados, los filtra y devuelve el resultado a través de un parámetro de tabla de salida.
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;
Hay tres convenciones que vale la pena destacar. Un punto y coma precede a cualquier lectura de una variable, por lo que :lt_all lee la variable de tabla mientras lt_all A la izquierda se le asigna. READS SQL DATA le indica al optimizador que el procedimiento no tiene efectos secundarios, lo que permite una paralelización más agresiva. Y un procedimiento que devuelve varios parámetros de salida es precisamente la capacidad de la que carece SQL estándar.
Llamarlo es sencillo:
CALL DHK_SCHEMA.GET_HIGH_EARNERS (50000, ?, ?);
Funciones definidas por el usuario, tanto escalares como de tabla.
Mientras que un procedimiento realiza acciones, una función devuelve un valor y puede utilizarse dentro de una consulta. SQL Script ofrece dos formas, pero no son intercambiables.
| Parámetro | UDF escalar | Tabla UDF |
|---|---|---|
| Returns | Un valor único | Un conjunto de resultados |
| Utilizada en | Lista SELECT, cláusula WHERE, expresiones | La cláusula FROM, como una tabla |
| Puede modificar los datos | No | No |
| Uso típico | Cálculo reutilizable como una tasa impositiva | Vista parametrizada que devuelve filas filtradas |
-- 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;
Una función de tabla se define con RETURNS TABLE y luego se consulta en la cláusula FROM, lo que la convierte en la forma natural de construir un conjunto de datos reutilizable y parametrizado que una vista de cálculo o el informe puede consumir.
SQL Script Mejores Prácticas
Los scripts SQL funcionan bien cuando se escriben para permitir la paralelización del motor, y mal cuando se escriben como código de aplicación. Seis hábitos marcan la diferencia.
- Prefiero lo declarativo a lo imperativo. Una sola instrucción basada en conjuntos supera con creces a un bucle que procesa las filas una a una. Utilice un bucle FOR solo cuando la lógica realmente no pueda expresarse como una operación de conjuntos.
- Evite los cursores. Obligan al procesamiento fila por fila y anulan por completo el motor de cálculo. Casi cualquier cursor se puede reescribir como una unión o una agregación.
- Mantengamos las declaraciones independientes. Dos variables de tabla que no se referencian entre sí se calculan en paralelo. Al encadenar cada paso a través del anterior, se serializa todo el procedimiento.
- Declarar LECTURA DATOS SQL donde sea verdadero. Esto indica que el procedimiento no tiene efectos secundarios, lo que permite una mayor optimización.
- Filtrar lo antes posible. Reducir el número de filas en la primera variable de tabla reduce todo lo que viene después, mientras que el filtrado al final ya ha pagado el coste.
- Migrar para dejar de usar las funciones CE_. Están obsoletas, no se pueden combinar libremente con SQL en una misma instrucción, y el optimizador de SQL ahora maneja mejor el mismo trabajo.
La sintaxis a nivel de sentencia se cubre en SAP HANA-SQL, las funciones disponibles dentro de un procedimiento en SAP Funciones SQL de HANAy los objetos de modelado que consumen estos procedimientos en el SAP Modelado HANA tutorial.
