在 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 的復雜業務邏輯。選擇變量的類型應基于你的業務場景及性能需求。