存储函数
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查询
• 增强数据一致性
通过合理使用存储函数,可以使数据库应用更加模块化和可维护。
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25044
- 42023-09-25浏览数:18519
- 52020-05-11浏览数:17526