| 参数类型 | 作用 | 特点 |
|---|---|---|
IN |
传入参数 | 调用时需传入值,存储过程内可使用 |
OUT |
传出参数 | 存储过程内赋值,调用后可通过变量获取结果 |
INOUT |
传入 + 传出 | 既需传入初始值,存储过程内可修改并传出 |
-- 创建存储过程(3 个 OUT 参数分别存储最低、最高、平均价格)
CREATE PROCEDURE productpricing(
OUT p1 DECIMAL(8,2), -- 最低价格
OUT ph DECIMAL(8,2), -- 最高价格
OUT pa DECIMAL(8,2) -- 平均价格
)
BEGIN
SELECT MIN(prod_price) INTO p1 FROM products;
SELECT MAX(prod_price) INTO ph FROM products;
SELECT AVG(prod_price) INTO pa FROM products;
END;
-- 调用存储过程(需传入 3 个用户变量)
CALL productpricing(@pricelow, @pricehigh, @priceaverage);
-- 查看结果(通过变量获取传出值)
SELECT @pricelow, @pricehigh, @priceaverage;
-- 创建存储过程(IN 传入订单号,OUT 传出订单合计)
CREATE PROCEDURE ordertotal(
IN onumber INT, -- 订单号(传入)
OUT ototal DECIMAL(8,2) -- 订单合计(传出)
)
BEGIN
SELECT SUM(item_price * quantity)
FROM orderitems
WHERE order_num = onumber
INTO ototal; -- 计算结果存入 OUT 参数
END;
-- 调用(计算订单号 2005 的合计)
CALL ordertotal(2005, @total);
-- 查看结果
SELECT @total;
-- 创建存储过程(支持是否加营业税的条件判断)
CREATE PROCEDURE ordertotal(
IN onumber INT, -- 订单号(IN)
IN taxable BOOLEAN, -- 是否加税(1=加,0=不加)(IN)
OUT ototal DECIMAL(8,2) -- 最终合计(OUT)
)
COMMENT 'Obtain order total, optionally adding tax' -- 备注(SHOW PROCEDURE 可查看)
BEGIN
-- 1. 定义局部变量(仅存储过程内有效)
DECLARE total DECIMAL(8,2); -- 基础合计
DECLARE taxrate INT DEFAULT 6; -- 营业税率(默认 6%)
-- 2. 计算基础合计(不含税)
SELECT SUM(item_price * quantity)
FROM orderitems
WHERE order_num = onumber
INTO total;
-- 3. 条件判断:是否加税
IF taxable THEN
SELECT total + (total / 100 * taxrate) INTO total;
END IF;
-- 4. 赋值给 OUT 参数
SELECT total INTO ototal;
END;
-- 调用(订单 2005,加税)
CALL ordertotal(2005, 1, @total);
SELECT @total;
声明 → 打开 → 读取 → 关闭
CREATE PROCEDURE processorders()
BEGIN
-- 1. 声明局部变量
DECLARE done BOOLEAN DEFAULT 0; -- 循环终止标记(0=未结束,1=结束)
DECLARE o INT; -- 存储订单号
-- 2. 声明游标(关联“查询所有订单号”的 SELECT 语句)
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
-- 3. 声明“游标结束”处理器(当无更多行时,设置 done=1)
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
-- 4. 打开游标(执行 SELECT 语句,加载结果集)
OPEN ordernumbers;
-- 5. 循环读取数据(REPEAT 循环:先执行,后判断)
REPEAT
-- 读取当前行的订单号,存入变量 o
FETCH ordernumbers INTO o;
UNTIL done END REPEAT; -- 当 done=1 时终止循环
-- 6. 关闭游标
CLOSE ordernumbers;
END;
CREATE PROCEDURE processorders()
BEGIN
-- 1. 声明局部变量
DECLARE done BOOLEAN DEFAULT 0;
DECLARE o INT; -- 订单号
DECLARE t DECIMAL(8,2);-- 订单合计(含税)
-- 2. 声明游标(查询所有订单号)
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
-- 3. 声明处理器(游标结束时设 done=1)
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
-- 4. 创建临时表(存储订单合计结果,不存在则创建)
CREATE TABLE IF NOT EXISTS ordertotals(
order_num INT,
total DECIMAL(8,2)
);
-- 5. 打开游标
OPEN ordernumbers;
-- 6. 循环读取并处理数据
REPEAT
-- 读取订单号
FETCH ordernumbers INTO o;
-- 调用之前的 ordertotal 存储过程,计算含税合计
CALL ordertotal(o, 1, t);
-- 将结果插入 ordertotals 表
INSERT INTO ordertotals(order_num, total) VALUES(o, t);
UNTIL done END REPEAT;
-- 7. 关闭游标
CLOSE ordernumbers;
END;
-- 调用存储过程后,查看结果
SELECT * FROM ordertotals;