GBase 8a
适配迁移
文章

存储过程中入参变量、DECLARE局部变量和@用户变量的区别

发表于2025-03-20 14:14:5996次浏览2个评论

存储过程中入参变量、DECLARE局部变量和@用户变量的区别

一、定义方式与作用域
1. ‌入参变量(IN/OUT/INOUT参数)‌
‌定义方式‌:在存储过程声明时通过参数列表定义,必须指定类型和方向。
CREATE PROCEDURE proc(
 IN in_param INT,       -- 输入参数(默认)
 OUT out_param VARCHAR(50), -- 输出参数
 INOUT inout_param FLOAT    -- 输入输出参数
)
‌作用域‌:整个存储过程内部。
‌生命周期‌:仅在存储过程执行期间有效。
2. ‌DECLARE局部变量‌
‌定义方式‌:在BEGIN...END块内使用DECLARE关键字声明,需指定数据类型。
BEGIN
 DECLARE local_var INT;        -- 声明局部变量
 DECLARE another_var VARCHAR(20) DEFAULT 'default';
END;
‌作用域‌:仅在当前BEGIN...END块内有效。
‌生命周期‌:从声明位置开始,到块结束时销毁。
3. ‌@用户变量‌
‌定义方式‌:以@开头,无需声明,直接赋值即可使用。
SET @user_var = 10;  -- 直接赋值
‌作用域‌:整个数据库会话(Session)。
‌生命周期‌:会话结束时自动销毁。

二、性能与内存管理
‌入参变量‌
高效:仅传递值或引用,无额外内存开销。
适合频繁调用的场景。

‌DECLARE局部变量‌
内存占用低:生命周期严格限定在代码块内。
适合存储中间计算结果或临时数据。

‌@用户变量‌
潜在风险:长期占用内存(会话不结束则不释放)。
滥用可能导致会话间数据污染(尤其在并发环境)。

三、最佳实践
‌优先使用DECLARE局部变量‌处理内部逻辑,避免污染全局环境。
‌合理使用入参变量‌传递数据,明确输入输出方向(IN/OUT/INOUT)。
‌谨慎使用@用户变量‌,仅在需要跨过程共享数据时使用,并注意会话隔离。
‌避免在存储过程中依赖@变量状态‌,防止并发问题。
 

评论

登录后才可以发表评论
崔哥发表于 9个月前
人生贵相知,何用金与钱
用户头像
levvel发表于 1个月前
感谢分享