GaussDB SQL基础语法:变量与常量详解

GaussDB SQL基础语法:变量与常量详解
变量和常量是SQL编程中实现动态数据处理的核心要素。本文将结合GaussDB特性,系统讲解变量的作用域管理、常量的类型表示及实际应用技巧。

一、变量类型与作用域

  1. 会话级变量
-- 设置会话变量(适用于当前连接)
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;
  1. 局部变量(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 
$$;
  1. 用户自定义变量(存储过程)
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;
$$;

二、常量表示规范

  1. 基础类型常量
-- 字符串常量(单引号)
SELECT '2023-10-01'::DATE AS start_date;

-- 数值常量(自动类型推断)
SELECT 3.1415926 + 100 AS result;

-- 布尔常量
WHERE is_active = TRUE
  1. 特殊常量
-- 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[];

三、动态变量应用场景

  1. 分页查询参数化
-- 使用变量控制分页参数
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 
$$;
  1. 循环控制变量
DO $$
DECLARE
    counter INT := 0;
BEGIN
    FOR i IN 1..10 LOOP
        counter := counter + i;
    END LOOP;
    RAISE NOTICE '累计值:%', counter; -- 输出1-10的累加和55
END 
$$;

四、高级应用技巧

  1. 变量与JSON结合
-- 动态解析JSON配置
DO $$
DECLARE
    config JSON := '{"threshold": 85, "interval": 3600}';
    min_value INT;
BEGIN
    min_value := (config->>'threshold')::INT;
    RAISE NOTICE '阈值设置为:%', min_value;
END 
$$;
  1. 变量在函数中的传递
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工具分析执行计划,对高频使用的变量优先考虑作用域最小化原则。

posted @ 2025-05-27 15:06  喜酱喜酱  阅读(13)  评论(0)    收藏  举报