网上找了很多关于goland使用mysql返回存储过程带返回值的,
golandgit上的mysql不支持存储过程在一个exec里面,只能一个exec,另一个query才能取到结果,这样就不能再高并发的情况下保证select取到的结果正确,为此实验了好多方法,最后只有这种方法,具体看图
goland mysql执行存储过程不支持多个返回集,用query在多个返回值的时候回取不到结果集
代码如下:
rows, _ := db.Query(fmt.Sprintf("call usp_activeAccount('%s','%s')", "t22ss33t111", "123456"))
for rows.Next() {
var result string
var accountid int
rows.Scan(&result, &accountid)
fmt.Println(result)
fmt.Println(accountid)
}
这样是可以取到结果集,但是必须usp_activeAccount这个存储过程 select返回只能有一个,不支持多个select结果集,具体看我的存储过程:
```sql
CREATE DEFINER=`root`@`localhost` PROCEDURE `usp_activeAccount`(in userid varchar(50), in password varchar(32))
begin
set @accountid = -1;
set @result = '0000';
if @result = '0000' and exists(select 1 from tbl_account A where A.accountName = userid) then
set @result = '0002';
end if;
if @result = '0000' then
-- 开始事务
-- BEGIN
if not exists(select @accountid:= A.accountid from tbl_account A where A.accountName = userid) then
-- 由于go语言只支持一个select,所以只能用exist解决
-- select @accountid:= A.accountid from tbl_account A where A.accountName = userid
-- if found_rows() = 0 then
-- 开始插入帐号信息
insert into tbl_account(accountName,password)
select userid,MD5(password);
if row_count() = 1 then
set @accountid = @@IDENTITY;
else
set @result = '0003';
end if;
end if;
if @result = '0000' THEN
commit;
else
rollback;
end if;
end if;
select @result, @accountid;
end
```
补充还有种就是直接用go 语句,就是消耗下性能代码如下:
db.Exec(fmt.Sprintf("call usp_login('%s','%s')", "a1a", "123456"))
rows,_:= db.Query("select @result, @accountid")
defer rows.Close()
for rows.Next() {
var result string
var accountid int
err := rows.Scan(&result, &accountid)
if err != nil {
//fmt.Println("ssssssssssssssssssssssssssss")
}
//fmt.Println(result, accountid)
}*/
tx, _:= db.Begin()
tx.Query("select A.accountid,")
/*_, err := tx.Exec(fmt.Sprintf("call usp_login('%s','%s')", "a1a", "123456"))
if err != nil {
fmt.Println("ssssssssssssssssssssssssssss")
}
rows,_:= tx.Query("select @result, @accountid")
defer rows.Close()
for rows.Next() {
var result string
var accountid int
err := rows.Scan(&result, &accountid)
if err != nil {
fmt.Println("ssssssssssssssssssssssssssss")
}
//fmt.Println(result, accountid)
}*/
tx.Commit()
性能测试表:
10000次sql,相差8秒
有疑问加站长微信联系(非本文作者))