goland使用mysql返回預存程序的使用
來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。網上找了很多關於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 stringvar accountid introws.Scan(&result, &accountid)fmt.Println(result)fmt.Println(accountid)}這樣是可以取到結果集,但是必須usp_activeAccount這個預存程序 select返回只能有一個,不支援多個select結果集,具體看我的預存程序:```sqlCREATE 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) thenset @result = '0002';end if; if @result = '0000' then-- 開始事務-- BEGINif 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 thenset @accountid = @@IDENTITY;elseset @result = '0003';end if;end if;if @result = '0000' THENcommit;elserollback;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 stringvar accountid interr := 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 stringvar accountid interr := rows.Scan(&result, &accountid)if err != nil {fmt.Println("ssssssssssssssssssssssssssss")}//fmt.Println(result, accountid)}*/tx.Commit()效能測試表:10000次sql,相差8秒423 次點擊 ∙ 1 贊