您好!欢迎访问家园网-www.jy.wang!

家园网

最后如何用CALL语句来执行上面的这个存储过程?

网络 作者:本站 点击:
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 对比

对比项MySQLOracle
关键字CALLEXEC 或 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 参数返回的值


标签: