CREATE PROCEDURE `shop`.`proc` (OUT param1 INT) BEGIN SELECT COUNT(*) INTO param1 FROM goods; END;
最后如何用CALL语句来执行上面的这个存储过程?
如何用 CALL 语句执行存储过程
直接给你最完整的答案:
sql
CALL proc(@count);SELECT @count;
一、CALL 语句的完整用法
1. 最简单的调用(只执行,不关心返回值)
sql
CALL proc(@count);
| 部分 | 含义 |
|---|---|
CALL | 执行存储过程的关键字 |
proc | 存储过程名称 |
@count | 用户变量,用来接收 OUT 参数的值 |
() | 参数括号,即使没有参数也要写 () |
2. 查看结果
sql
SELECT @count;
执行后会显示 goods 表的总行数。
二、什么是 @count?
@count 是 MySQL 中的用户变量。
| 特性 | 说明 |
|---|---|
| 命名规则 | 以 @ 开头 |
| 作用域 | 当前会话(连接)有效 |
| 类型 | 自动根据赋值确定 |
| 生命周期 | 连接断开才消失 |
示例验证
sql
-- 先查看变量是否存在(初始为 NULL)SELECT @count; -- 输出 NULL-- 调用存储过程CALL proc(@count);-- 再次查看,现在有值了SELECT @count; -- 输出商品总数
三、不同参数模式的调用方式
1. IN 参数(传入值)
sql
CREATE PROCEDURE proc_in(IN p_id INT)CALL proc_in(100); -- 直接传值
2. OUT 参数(接收返回值)
sql
CREATE PROCEDURE proc_out(OUT p_result INT)CALL proc_out(@result); -- 必须传变量(以@开头)SELECT @result;
3. INOUT 参数(既传又接)
sql
CREATE PROCEDURE proc_inout(INOUT p_value INT)SET @num = 10;CALL proc_inout(@num); -- 传变量SELECT @num; -- 变量被修改后返回
四、错误案例对比
| 错误写法 | 原因 |
|---|---|
CALL proc(100) | OUT 参数不能传常量 |
CALL proc(count) | MySQL 变量必须以 @ 开头 |
CALL proc | 缺少括号 () |
EXEC proc(@count) | SQL Server 的语法,MySQL 用 CALL |
五、完整操作演示
sql
-- 第1步:创建数据库和表(假设不存在)CREATE DATABASE IF NOT EXISTS shop;USE shop;CREATE TABLE goods ( id INT PRIMARY KEY, name VARCHAR(50));-- 第2步:插入测试数据INSERT INTO goods VALUES (1, '手机'), (2, '电脑'), (3, '耳机');-- 第3步:创建存储过程DELIMITER //CREATE PROCEDURE proc (OUT param1 INT)BEGIN SELECT COUNT(*) INTO param1 FROM goods;END //DELIMITER ;-- 第4步:调用存储过程CALL proc(@count);-- 第5步:查看结果SELECT @count; -- 输出 3
六、CALL 与变量作用域
sql
-- 调用前SELECT @count; -- NULLCALL proc(@count);-- 调用后SELECT @count; -- 3(有值了)SELECT @count + 10; -- 13(可以继续使用)SET @count = 0; -- 可以手动修改
七、与 Oracle 对比
| 对比项 | MySQL | Oracle |
|---|---|---|
| 关键字 | CALL | EXEC 或 BEGIN ... END; |
| 变量前缀 | @count | 不需要 @ |
| 接收 OUT 参数 | CALL proc(@var) | EXEC proc(:var) |
Oracle 写法:
sql
VARIABLE count NUMBER;EXEC proc(:count);PRINT count;
八、总结
| 问题 | 答案 |
|---|---|
| 如何调用带 OUT 参数的存储过程? | CALL 过程名(@变量名) |
| 如何查看结果? | SELECT @变量名 |
@ 是什么? | MySQL 用户变量的标识符 |
| 可以直接传数字吗? | ❌ 不可以,必须传变量 |
| 调用后变量会变吗? | ✅ 会,存储过程会修改它 |
一句话总结:执行这个存储过程用 CALL proc(@count);,然后通过 SELECT @count; 查看商品总数。@count 是 MySQL 的用户变量,专门用来接收 OUT 参数返回的值