GaussDB SQL基础语法:变量与常量详解
GaussDB SQL基础语法:变量与常量详解
变量和常量是SQL编程中实现动态数据处理的核心要素。本文将结合GaussDB特性,系统讲解变量的作用域管理、常量的类型表示及实际应用技巧。
一、变量类型与作用域
- 会话级变量
-- 设置会话变量(适用于当前连接)
SET my_app.user_id = 'U1001';
SELECT current_setting('my_app.user_id') AS current_user;
-- 使用双冒号语法获取数值型变量
SELECT current_setting('app.transaction_limit')::INT AS limit_value;
- 局部变量(PL/pgSQL块)
DO $$
DECLARE
emp_count INT;
avg_salary NUMERIC(10,2);
BEGIN
SELECT COUNT(*) INTO emp_count FROM employees;
SELECT AVG(salary) INTO avg_salary FROM employees;
RAISE NOTICE '员工总数:%,平均工资:%', emp_count, avg_salary;
END
$$;
- 用户自定义变量(存储过程)
CREATE OR REPLACE PROCEDURE calculate_bonus()
LANGUAGE plpgsql AS $$
DECLARE
base_amount CONSTANT NUMERIC := 5000; -- 常量定义
bonus_rate NUMERIC := 0.15;
BEGIN
UPDATE employees
SET salary = salary + (base_amount * bonus_rate)
WHERE department = 'IT';
END;
$$;
二、常量表示规范
- 基础类型常量
-- 字符串常量(单引号)
SELECT '2023-10-01'::DATE AS start_date;
-- 数值常量(自动类型推断)
SELECT 3.1415926 + 100 AS result;
-- 布尔常量
WHERE is_active = TRUE
- 特殊常量
-- NULL常量
INSERT INTO products (name, price) VALUES ('Test', NULL);
-- JSON常量
SELECT '{"city":"Shenzhen","temp":32}'::JSON AS weather_data;
-- 数组常量
SELECT ARRAY['A','B','C']::TEXT[];
三、动态变量应用场景
- 分页查询参数化
-- 使用变量控制分页参数
DO $$
DECLARE
page_size INT := 20;
current_page INT := 3;
BEGIN
EXECUTE format('
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS rn
FROM large_table
) tmp
WHERE rn BETWEEN %s AND %s',
(current_page-1)*page_size + 1,
current_page*page_size
);
END
$$;
- 循环控制变量
DO $$
DECLARE
counter INT := 0;
BEGIN
FOR i IN 1..10 LOOP
counter := counter + i;
END LOOP;
RAISE NOTICE '累计值:%', counter; -- 输出1-10的累加和55
END
$$;
四、高级应用技巧
- 变量与JSON结合
-- 动态解析JSON配置
DO $$
DECLARE
config JSON := '{"threshold": 85, "interval": 3600}';
min_value INT;
BEGIN
min_value := (config->>'threshold')::INT;
RAISE NOTICE '阈值设置为:%', min_value;
END
$$;
- 变量在函数中的传递
CREATE OR REPLACE FUNCTION get_employee_stats(
dept_id INT DEFAULT 1001, -- 默认参数
calc_type TEXT := 'AVG' -- 默认计算类型
) RETURNS NUMERIC AS $$
DECLARE
result_num NUMERIC;
BEGIN
EXECUTE format('
SELECT %I(salary) FROM employees
WHERE department = $1', calc_type)
INTO result_num
USING dept_id;
RETURN result_num;
END;
$$ LANGUAGE plpgsql;
-- 调用示例
SELECT get_employee_stats(1002, 'SUM'); -- 计算销售部总薪资
通过合理运用变量与常量,可以实现灵活的数据处理逻辑。建议结合GaussDB的EXPLAIN ANALYZE工具分析执行计划,对高频使用的变量优先考虑作用域最小化原则。

浙公网安备 33010602011771号