H2 數據庫中的系統函數與動態 SQL 相關關鍵字

在 H2 數據庫的進階應用中,系統函數關鍵字能直接調用數據庫內置能力,動態 SQL 相關關鍵字則支持靈活拼接查詢邏輯,兩者結合能應對動態篩選、數據格式轉換、元數據查詢等複雜場景,讓數據庫操作更具適應性和擴展性。

一、系統函數相關關鍵字

H2 內置了大量系統函數,通過SYSTEM_USER、DATABASE()、CURRENT_SCHEMA等關鍵字,可快速獲取數據庫元數據、環境信息,CAST、CONVERT則用於數據類型轉換,滿足多樣化數據處理需求。

1. 元數據與環境信息函數

SYSTEM_USER返回當前登錄的數據庫用户名,適合記錄操作日誌時標記操作用户:

-- 插入操作日誌,自動記錄當前登錄用户
INSERT INTO operation_logs (operate_user, operate_content, operate_time)
VALUES (SYSTEM_USER, '修改商品價格', CURRENT_TIMESTAMP);

DATABASE()返回當前數據庫名稱,CURRENT_SCHEMA返回當前使用的模式(Schema),在多數據庫、多模式部署場景中很實用:

-- 查詢當前數據庫和模式信息
SELECT 
    DATABASE() AS current_db,
    CURRENT_SCHEMA AS current_schema,
    SYSTEM_USER AS login_user;

TABLE_SCHEMA和COLUMN_NAME常配合INFORMATION_SCHEMA系統表,查詢表結構元數據,比如獲取users表的所有字段信息:

SELECT 
    COLUMN_NAME AS 字段名,
    DATA_TYPE AS 數據類型,
    IS_NULLABLE AS 是否允許空,
    COLUMN_DEFAULT AS 默認值
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'USERS' AND TABLE_SCHEMA = CURRENT_SCHEMA;

通過這種方式,無需手動查看建表語句,就能快速獲取表結構詳情。

2. 數據類型轉換函數

CAST是標準的類型轉換關鍵字,能將一種數據類型轉為另一種,比如將字符串類型的日期轉為DATE類型:

-- 將字符串日期轉為DATE類型,用於條件查詢
SELECT * FROM orders
WHERE order_time >= CAST('2024-01-01' AS DATE);

也可將數值類型轉為字符串,拼接成組合字段:

SELECT CONCAT('用户ID:', CAST(user_id AS VARCHAR(10))) AS user_label FROM users;

CONVERT功能與CAST類似,語法更靈活,支持指定字符集(針對字符串),比如將 UTF-8 編碼的字符串轉為其他字符集(H2 主要用於格式轉換):

-- 將數值轉為字符串,指定長度
SELECT CONVERT(pay_amount, VARCHAR(10)) AS amount_str FROM orders;
-- 將日期轉為指定格式的字符串
SELECT CONVERT(order_time, VARCHAR(10), 'yyyy-MM-dd') AS order_date FROM orders;

二、動態 SQL 相關關鍵字

動態 SQL 允許根據條件動態拼接查詢邏輯,PREPARE、EXECUTE、DEALLOCATE是 H2 支持的動態 SQL 核心關鍵字,適合查詢條件不固定的場景。

1. 預處理語句(PREPARE + EXECUTE)

PREPARE用於定義預處理語句,通過佔位符?接收動態參數,之後用EXECUTE傳入參數執行,能避免 注入,同時提升重複執行的效率:

-- 定義預處理語句:查詢指定用户、指定時間範圍內的訂單
PREPARE dynamic_order_query FROM
'SELECT order_no, pay_amount FROM orders
WHERE user_id = ? AND order_time BETWEEN ? AND ?';

-- 執行預處理語句,傳入參數(用户ID=1,時間範圍2024-01-01至2024-12-31)
EXECUTE dynamic_order_query USING 1, '2024-01-01 00:00:00', '2024-12-31 23:59:59';

-- 再次執行,傳入不同參數(用户ID=2,時間範圍2024-06-01至2024-06-30)
EXECUTE dynamic_order_query USING 2, '2024-06-01 00:00:00', '2024-06-30 23:59:59';

2. 釋放預處理語句(DEALLOCATE)

當預處理語句不再使用時,用DEALLOCATE釋放資源,避免佔用數據庫連接資源:

-- 釋放預處理語句
DEALLOCATE PREPARE dynamic_order_query;

3. 動態表名 / 字段名(配合字符串拼接)

H2 支持通過字符串拼接動態指定表名或字段名(需開啓動態 SQL 支持),比如根據傳入的表名查詢數據總量:

-- 定義動態查詢表總量的預處理語句
PREPARE dynamic_count_query FROM
'SELECT COUNT(*) AS total FROM ' || ?;

-- 執行,查詢users表的記錄數
EXECUTE dynamic_count_query USING 'users';

-- 執行,查詢orders表的記錄數
EXECUTE dynamic_count_query USING 'orders';

注意:這種方式需謹慎使用,避免傳入未校驗的表名 / 字段名導致 注入風險,僅適用於內部可控場景。

這些系統函數和動態 SQL 相關關鍵字,前者提供了直接訪問數據庫底層信息和數據轉換的能力,後者則打破了固定 SQL 的限制,讓查詢邏輯更靈活。在實際開發中,查詢表結構、記錄操作日誌、處理動態篩選條件等場景,都能通過它們高效實現,讓 H2 數據庫的適配性和擴展性大幅提升。