MySql如何调用存储过程

Ezirio 2019-04-03 01:47:55
刚开始接触mysql的存储过程,定义了一个借书业务的存储过程,接受两个输入参数(IN id int,IN isbn char(30)),没有输出参数,但是存储过程最后返回插入的新数据select * From xx

网上的调用方法都是
call library_borrow(1,1234567)

然而我运行后发现传进去的参数变为null,然后查看Navicat的调用语句,发现却是
set @id = 1
set @isbn =1234567
call `library_borrow`(@id,@isbn)

请问下这种情况为什么不能直接call xx(1,1234567)


以下是完整代码
CREATE DEFINER=`root`@`localhost` PROCEDURE `library_borrow`(IN id int, IN isbn char(30))
begin
DECLARE lid int default 0; #新插入的记录id
DECLARE uname char(30) default'';#用户名
DECLARE bname char(30) default'';#书名
DECLARE sdate datetime default now();
DECLARE edate datetime default date_add(sdate,INTERVAL '1' MONTH);

set @uname = (select user_name from web_user where user_id=@id);
set @bname = (select book_name from web_book where book_isbn=@isbn);
set @sdate = now();
set @edate = date_add(sdate,INTERVAL '1' MONTH);

#把借书记录插入表格
insert into web_borrow_record(borrow_user_id,borrow_user_name,borrow_book_isbn,borrow_book_name,
borrow_start_date,borrow_end_date,borrow_return_status)
values(@id,@uname,@isbn,@bname,@sdate,@edate,'false');

#获取刚插入数据的id
set @lid = LAST_INSERT_ID();

#用户借书限额减一
update web_user
set user_book_limit = user_book_limit - 1
where user_id = @id;

#库存减一
update web_stock
set stock_book_remain = stock_book_remain - 1
where stock_book_isbn = @isbn;

#返回结果
select * from web_borrow_record where borrow_id = @lid;
end

...全文
512 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ezirio 2019-04-03
  • 打赏
  • 举报
回复
引用 3 楼 AHUA1001 的回复:
过程内的变量,有没有@影响都不大,有没有@的区别,您可以自己百度一下。 但是传入的参数,肯定是和定义存储过程时,相关参数完全一致的。 也就是说library_borrow`(IN id int, IN isbn char(30))里的id,和@id完全是两个东西。
十分感谢,之前看的很多教程都没讲到这些细节。
AHUA1001 2019-04-03
  • 打赏
  • 举报
回复
过程内的变量,有没有@影响都不大,有没有@的区别,您可以自己百度一下。
但是传入的参数,肯定是和定义存储过程时,相关参数完全一致的。
也就是说library_borrow`(IN id int, IN isbn char(30))里的id,和@id完全是两个东西。
Ezirio 2019-04-03
  • 打赏
  • 举报
回复
引用 1 楼 AHUA1001 的回复:
call `library_borrow`(@id,@isbn)
这样调用存储过程,完全正确。
存储过程定义的参数`library_borrow`(IN id int, IN isbn char(30))也完全正确。
但是你在存储过程里,用到的传入参数,应该是id和isbn,而不是@id和@isbn。
看你的存储过程里,用的都是@id和@isbn,由于您的存储过程里吗,没有定义这两个参数,所以,这两个参数都是空。
改成id和isbn就OK了。
也就是说过程体内的变量,要用@前缀,而参数变量直接引用是吗?
AHUA1001 2019-04-03
  • 打赏
  • 举报
回复
call `library_borrow`(@id,@isbn)
这样调用存储过程,完全正确。
存储过程定义的参数`library_borrow`(IN id int, IN isbn char(30))也完全正确。
但是你在存储过程里,用到的传入参数,应该是id和isbn,而不是@id和@isbn。
看你的存储过程里,用的都是@id和@isbn,由于您的存储过程里吗,没有定义这两个参数,所以,这两个参数都是空。
改成id和isbn就OK了。

56,940

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧