在 SAP HANA SQLScript 中,可以使用多种变量类型,包括标量(Scalar)类型、表类型和结构化类型。以下是各种变量类型的详细说明和示例。
1. 标量变量(Scalar Variables)
标量变量是用于存储单个值(如数字、字符串、日期等)的变量类型。常用于计算结果的存储或临时逻辑操作。
常见标量数据类型:
数据类型 | 描述 |
---|---|
INTEGER | 整数类型,例如 10, 20 等值。 |
BIGINT | 大整数类型。 |
SMALLINT | 小整数类型。 |
DECIMAL(p,s) | 精确小数类型,其中 p 是总位数,s 是小数位数。 |
DOUBLE | 双精度浮点数类型。 |
NVARCHAR(n) | 可变长度的 Unicode 字符串,最多可以存储 n 个字符。 |
VARCHAR(n) | 可变长度的非 Unicode 字符串,最多可以存储 n 个字符。 |
DATE | 存储日期值(YYYY-MM-DD)。 |
TIME | 存储时间值(HH:MI:SS)。 |
TIMESTAMP | 存储日期和时间值(YYYY-MM-DD HH:MI:SS[.F])。 |
BOOLEAN | 布尔值类型(TRUE、FALSE)。 |
使用示例:
DO BEGIN-- 声明变量DECLARE v_count INTEGER;DECLARE v_average DECIMAL(10,2);DECLARE v_name NVARCHAR(50);DECLARE v_current_date DATE;-- 给变量赋值SELECT COUNT(*) INTO v_count FROM EMPLOYEES WHERE SALARY > 50000;SELECT AVG(SALARY) INTO v_average FROM EMPLOYEES WHERE DEPT_ID = 101;SET :v_name = 'John Smith';SET :v_current_date = CURRENT_DATE;-- 输出调试信息(仅供开发环境)-- PRINT 'Name: ' || :v_name || ', Date: ' || :v_current_date;
END;
2. 表变量(Table Variables 或 Temporary Tables)
表变量用于存储一组数据(表格形式)。表变量是将数据存储在内存中,因此适合执行中间计算或复杂查询。
特点:
- 表变量可以看作是一个 “临时表”。
- 可以用
CREATE LOCAL TEMPORARY TABLE
创建,也可以直接声明。 - 作用域仅限当前会话或 SQLScript 脚本的生命周期。
- 必须指定每个列的名称和数据类型。
使用示例:
DO BEGIN-- 声明临时表CREATE LOCAL TEMPORARY TABLE #EMPLOYEE_TEMP (EMP_ID INT,NAME NVARCHAR(100),SALARY DECIMAL(10,2),DEPARTMENT NVARCHAR(50));-- 将查询结果插入到临时表中INSERT INTO #EMPLOYEE_TEMP SELECT EMP_ID, NAME, SALARY, DEPT_NAMEFROM EMPLOYEES INNER JOIN DEPARTMENTSON EMPLOYEES.DEPT_ID = DEPARTMENTS.DEPT_IDWHERE EMPLOYEES.SALARY > 50000;-- 查询临时表SELECT * FROM #EMPLOYEE_TEMP;-- 清理临时表(可选,因为在会话结束时自动删除)DROP TABLE #EMPLOYEE_TEMP;
END;
3. 结构化变量(Structured Variables 行结构/Record Row Type)
结构化变量(也叫记录或行结构变量)允许存储一行数据的多个字段。这种类型适用于存储数据行(例如存储查询返回的单个行的结果)。
定义结构化变量的方式:
- 使用表结构中的字段定义类似的记录行。
- 通过查询结果直接赋值给结构化变量。
使用示例:
DO BEGIN-- 声明结构化变量(类似于一行记录)DECLARE v_employee_record EMPLOYEES%ROWTYPE;-- 获取单条记录并存入结构化变量SELECT EMP_ID, NAME, SALARY, DEPT_ID INTO v_employee_record FROM EMPLOYEES WHERE EMP_ID = 1001;-- 访问结构化变量的字段(示例输出)-- PRINT 'Employee Name: ' || :v_employee_record.NAME || ', Salary: ' || :v_employee_record.SALARY;
END;
注意:
结构化变量中,每个字段的类型会自动与表定义中的字段匹配,因此可以很方便地表示一行查询结果。
4. 游标(CURSOR)变量
游标用于处理返回多行结果集的查询。通过游标,可以逐行遍历一组查询结果。
声明和使用游标的基本步骤:
- 声明游标并指定查询语句。
- 打开游标(
OPEN
)。 - 逐行获取数据(
FETCH
)。 - 关闭游标(
CLOSE
)。
使用示例:
DO BEGIN-- 声明游标,定义查询语句DECLARE cur_employee CURSOR FORSELECT EMP_ID, NAME, SALARY FROM EMPLOYEES WHERE SALARY > 50000;-- 声明变量用于存储游标中的字段值DECLARE v_emp_id INTEGER;DECLARE v_emp_name NVARCHAR(100);DECLARE v_emp_salary DECIMAL(10,2);-- 打开游标OPEN cur_employee;-- 遍历游标中的结果集WHILE (cur_employee IS NOT EMPTY) DOFETCH cur_employee INTO v_emp_id, v_emp_name, v_emp_salary;-- 处理每一行数据(示例:输出或逻辑操作)-- PRINT 'Employee: ' || :v_emp_name || ', Salary: ' || :v_emp_salary;END WHILE;-- 关闭游标CLOSE cur_employee;
END;
5. 常见的类型约束和自动匹配
在声明变量类型时,有一些实用约束和功能:
-
自动类型绑定:
如果你希望一个变量和某个表列的类型一致,可以使用%TYPE
。DECLARE v_salary EMPLOYEES.SALARY%TYPE;
-
行类型绑定:
如果你希望一个变量结构和整个表/查询结果行一致,可以使用%ROWTYPE
。DECLARE v_employee EMPLOYEES%ROWTYPE;
总结:支持的变量类型
- 标量变量(单值类型,如 INTEGER, DECIMAL, NVARCHAR 等)。
- 表变量(类似临时表,用于存储表格形式的数据)。
- 结构化变量(记录/行变量,用于存储结构化查询结果,
%ROWTYPE
)。 - 游标变量(用于处理多行记录,便于逐行操作)。
这些类型结合起来能够完成 SAP HANA 中 SQLScript 的复杂业务逻辑。选择变量的类型应基于你的业务场景及性能需求。