1. 变量定义
- 局部变量:在存储过程或函数内部声明,作用域仅限于声明它的BEGIN...END块。使用
DECLARE
关键字声明,语法为DECLARE variable_name data_type [DEFAULT value];
。例如:
DELIMITER //
CREATE FUNCTION simpleFunction() RETURNS INT
DETERMINISTIC
BEGIN
DECLARE localVar INT DEFAULT 10;
RETURN localVar;
END //
DELIMITER ;
- 全局变量:由MySQL服务器维护,作用域是整个MySQL实例。全局变量在服务器启动时初始化,可以通过
SET GLOBAL
语句设置,使用时需加@@global.
前缀。例如:
SET GLOBAL newGlobalVar = 20;
SELECT @@global.newGlobalVar;
2. 变量使用
- 局部变量:在声明它的BEGIN...END块内使用,常用于临时存储中间计算结果等。例如:
DELIMITER //
CREATE FUNCTION calculateSum() RETURNS INT
DETERMINISTIC
BEGIN
DECLARE num1 INT DEFAULT 5;
DECLARE num2 INT DEFAULT 3;
DECLARE sumResult INT;
SET sumResult = num1 + num2;
RETURN sumResult;
END //
DELIMITER ;
- 全局变量:可在不同的连接和存储过程/函数中访问,用于控制服务器层面的一些配置或共享信息。例如,设置全局的事务隔离级别:
SET GLOBAL transaction_isolation = 'READ - COMMITTED';
3. 复杂函数逻辑中变量管理
- 避免命名冲突:
- 局部变量命名规则:使用有意义且与全局变量区分开的命名,如采用特定前缀(如
local_
)。例如:
DELIMITER //
CREATE FUNCTION complexFunction() RETURNS INT
DETERMINISTIC
BEGIN
DECLARE local_total INT DEFAULT 0;
-- 这里假设全局变量有个类似的total,通过前缀区分
-- 复杂逻辑,例如循环计算
DECLARE i INT DEFAULT 1;
WHILE i <= 10 DO
SET local_total = local_total + i;
SET i = i + 1;
END WHILE;
RETURN local_total;
END //
DELIMITER ;
- **尽量少用全局变量**:在函数逻辑中,仅在真正需要跨函数/连接共享数据时使用全局变量,因为过多使用可能导致不可预测的结果和命名冲突。
- 确保函数正确执行:
- 局部变量作用域控制:合理界定BEGIN...END块,确保局部变量只在需要的逻辑范围内存在。例如,若有多个嵌套逻辑块,不同块内相同用途的局部变量可通过不同前缀或更具体的命名区分。
- 全局变量稳定性:如果在函数中使用全局变量,要考虑其值可能被其他连接或操作修改的情况。可以在函数开始时备份全局变量值,函数结束时恢复,以确保函数执行的稳定性。例如:
DELIMITER //
CREATE FUNCTION useGlobalVar() RETURNS INT
DETERMINISTIC
BEGIN
DECLARE backupGlobal INT;
SET backupGlobal = @@global.someGlobalVar;
-- 函数逻辑,可能修改全局变量
SET @@global.someGlobalVar = @@global.someGlobalVar + 1;
DECLARE result INT;
SET result = @@global.someGlobalVar;
-- 恢复全局变量
SET @@global.someGlobalVar = backupGlobal;
RETURN result;
END //
DELIMITER ;