GBase 8a
其他
文章

存储函数

发表于2025-12-24 14:26:0333次浏览6个评论

GBase存储函数详解

一、什么是存储函数

存储函数(Stored Function)是GBase中一种可重用的数据库对象,它接收参数、执行特定操作并返回单个值。与存储过程不同,函数必须返回一个值,并且可以在SQL语句中像内置函数一样调用。

二、存储函数的特点

1. 必须返回一个值(通过RETURN语句)
2. 可以在SQL语句中直接调用,如SELECT、WHERE子句
3. 不能有输出参数(所有参数都是输入参数)
4. 通常用于计算和返回特定值

三、创建存储函数

基本语法

DELIMITER //

CREATE FUNCTION 函数名([参数列表])
RETURNS 返回类型
[特性]
BEGIN
   -- 函数体
   RETURN 返回值;
END //

DELIMITER ;


参数格式

参数名 数据类型

四、示例演示

示例1:简单的计算函数

-- 创建函数计算折扣后价格
DELIMITER //

CREATE FUNCTION calculate_discount_price(
   original_price DECIMAL(10,2),
   discount_rate DECIMAL(5,2)
)
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
   DECLARE final_price DECIMAL(10,2);
   
   IF discount_rate > 1 THEN
       SET discount_rate = discount_rate / 100;
   END IF;
   
   SET final_price = original_price * (1 - discount_rate);
   RETURN final_price;
END //

DELIMITER ;

-- 使用函数
SELECT calculate_discount_price(100.00, 0.2);  -- 返回80.00


示例2:根据ID获取用户名

DELIMITER //

CREATE FUNCTION get_user_name(user_id INT)
RETURNS VARCHAR(100)
BEGIN
   DECLARE user_name VARCHAR(100);
   
   SELECT name INTO user_name 
   FROM users 
   WHERE id = user_id;
   
   IF user_name IS NULL THEN
       SET user_name = '未知用户';
   END IF;
   
   RETURN user_name;
END //

DELIMITER ;

-- 在查询中使用
SELECT order_id, get_user_name(user_id) as customer_name
FROM orders;


示例3:带条件判断的函数

DELIMITER //

CREATE FUNCTION get_grade_level(score INT)
RETURNS VARCHAR(20)
BEGIN
   DECLARE level VARCHAR(20);
   
   IF score >= 90 THEN
       SET level = '优秀';
   ELSEIF score >= 80 THEN
       SET level = '良好';
   ELSEIF score >= 60 THEN
       SET level = '及格';
   ELSE
       SET level = '不及格';
   END IF;
   
   RETURN level;
END //

DELIMITER ;


示例4:使用循环的计算函数

DELIMITER //

CREATE FUNCTION calculate_factorial(n INT)
RETURNS BIGINT
BEGIN
   DECLARE result BIGINT DEFAULT 1;
   DECLARE i INT DEFAULT 1;
   
   IF n < 0 THEN
       RETURN -1;  -- 表示错误
   END IF;
   
   WHILE i <= n DO
       SET result = result * i;
       SET i = i + 1;
   END WHILE;
   
   RETURN result;
END //

DELIMITER ;


示例5:处理日期的函数

DELIMITER //

CREATE FUNCTION get_age(birth_date DATE)
RETURNS INT
BEGIN
   DECLARE age INT;
   
   SET age = YEAR(CURDATE()) - YEAR(birth_date);
   
   -- 如果今年生日还没过,减1岁
   IF DATE_FORMAT(CURDATE(), '%m%d') < DATE_FORMAT(birth_date, '%m%d') THEN
       SET age = age - 1;
   END IF;
   
   RETURN age;
END //

DELIMITER ;


五、管理存储函数

查看函数

-- 查看所有函数
SHOW FUNCTION STATUS;

-- 查看函数定义
SHOW CREATE FUNCTION 函数名;

-- 从information_schema查看
SELECT * 
FROM information_schema.ROUTINES 
WHERE ROUTINE_TYPE = 'FUNCTION';


修改函数

GBase不支持直接修改函数,需要先删除再重新创建:
DROP FUNCTION IF EXISTS 函数名;
-- 然后重新CREATE FUNCTION


删除函数

DROP FUNCTION [IF EXISTS] 函数名;

六、总结

存储函数是GBase中强大的工具,可以:
• 封装复杂的业务逻辑

• 提高代码重用性

• 简化SQL查询

• 增强数据一致性

通过合理使用存储函数,可以使数据库应用更加模块化和可维护。

评论

登录后才可以发表评论
冰凤发表于 7个月前
1
冰凤发表于 7个月前
2
冰凤发表于 7个月前
3
冰凤发表于 7个月前
4
冰凤发表于 7个月前
5
用户头像
levvel发表于 4个月前
评论是对发帖人的一种尊重