参数(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;