参数(Parameters)

建立一个带参数的存储过程

-- 更改分隔符
DELIMITER $$
-- 创建存储过程
CREATE PROCEDURE get_student_by_ssex
(-- 在括号内填入参数及类型
     ssex CHAR(1)
)
BEGIN
    SELECT *
    FROM Student AS s
    -- 设置表格别名以区分参数
    WHERE s.Ssex=ssex;
END$$
-- 将分隔符更改回来
DELIMITER ;

调用带参数的存储过程

call get_student_by_ssex('');

带默认值的参数

-- 更改分隔符
DELIMITER $$
-- 创建存储过程
CREATE PROCEDURE get_student_sname
(-- 在括号内填入参数及类型
         ssex CHAR(1),
         sid INT
)
BEGIN
    SELECT *
    FROM Student AS s
        -- 使用ifnull使参数值为空时,语句恒成立
        WHERE s.Ssex = IFNULL(ssex,s.Ssex)
              and s.SId = IFNULL(sid,s.SId);
END$$
-- 将分隔符更改回来
DELIMITER ;

参数验证

DELIMITER $$
-- 创建存储过程
CREATE PROCEDURE make_payment
(    -- 设置参数
     invoice_id INT,
     payment_amount DECIMAL(9,2),
     payment_date DATE
)
BEGIN
    -- 添加数据验证,当payment_amount小于0时报错:Invalid payment amount
    if payment_amount<=0 then signal sqlstate '22003'
    set message_text='Invalid payment amount';
    end if;
        
    -- 依据invoice_id更新payment_total、payment_date的数值
    UPDATE invoices i
    set i.payment_total=payment_amount,
        i.payment_date=payment_date
    where i.invoice_id=invoice_id;
END$$
-- 将分隔符更改回来
DELIMITER ;

输出参数

invoices表格:

创建存储过程

DELIMITER $$
-- 创建存储过程
CREATE PROCEDURE get_unpaid_invoices_for_client
(    -- 设置参数
     client_id int,
     -- 设置输出参数
     out invoices_count int,
     out invoices_total decimal(9,2)
)
BEGIN
    -- 查询未付款发票数量及总额
    select count(*),sum(invoice_total)
    -- 将查询值赋值给两个输出变量
    into invoices_count,invoices_total
    from invoices i
    where i.client_id=client_id and i.payment_total=0;
END$$
-- 将分隔符更改回来
DELIMITER ;

输出参数值

-- 先给两个输出参数赋值0
set @invoices_count=0;
set @invoices_total=0;
call get_unpaid_invoices_for_client(3,@invoices_count,@invoices_total);
-- 输出参数
select @invoices_count,@invoices_total;

 

posted @ 2020-12-08 16:44  醴酒微甜  阅读(136)  评论(0编辑  收藏  举报