猿问

Go MySQL 存储过程无法返回结果集

如果我运行以下代码,但将“CALL”替换为"SELECT * FROM User LIMIT 1"我找回了一个用户。如果我切换到调用存储过程,我会不断收到此错误:


panic: Error 1312: PROCEDURE MobiFit_Dev.User_ByEmail can't return a result set in the given context [recovered]

    panic: Error 1312: PROCEDURE MobiFit_Dev.User_ByEmail can't return a result set in the given context

我如何呼叫我的 SP?


这是我的 SP:


DELIMITER $$


USE `MobiFit_Dev`$$


DROP PROCEDURE IF EXISTS `User_ByEmail`$$


CREATE DEFINER=`root`@`localhost` PROCEDURE `User_ByEmail`(pEmail VARCHAR(250))

BEGIN

    SELECT 

        * 

    FROM

        `User` 

    WHERE `Email` = pEmail ;

END$$


DELIMITER ;

包实体


import (

    "database/sql"

    "fmt"

    "github.com/go-sql-driver/mysql"

    "mobifit/db"

    // "time"

)


const (

    Male   = "Male"

    Female = "Female"

)


type User struct {

    Id             sql.NullInt64

    Email          sql.NullString

    HashedPassword sql.NullString

    RoleId         sql.NullInt64

    FirstName      sql.NullString

    LastName       sql.NullString

    Gender         sql.NullString

    DateOfBirth    mysql.NullTime

    Height         sql.NullFloat64

    CurrentWeight  sql.NullFloat64

    CreatedAt      mysql.NullTime

    ConfirmedAt    mysql.NullTime

    LastActivityAt mysql.NullTime

    DeletedAt      mysql.NullTime

}


func UserByEmail(email string) *User {

    db := db.DB()

    u := new(User)

    rows, err := db.Query("CALL User_ByEmail(?)", email) << A SELECT *... works but this doesn't


    if err != nil {

        panic(err)

    }

    fmt.Println(rows.Columns())


    for rows.Next() {

        if err := rows.Scan(

            &u.Id,

            &u.Email,

            &u.HashedPassword,

            &u.RoleId,

            &u.FirstName,

            &u.LastName,

            &u.Gender,

            &u.DateOfBirth,

            &u.Height,

            &u.CurrentWeight,

            &u.CreatedAt,

            &u.ConfirmedAt,

            &u.LastActivityAt,

            &u.DeletedAt); err != nil {

            panic(err)

        }

    }


    if err := rows.Err(); err != nil {

        panic(err)

    }

    fmt.Println(u)

    return u

}


慕运维8079593
浏览 285回答 2
2回答

杨魅力

尝试使用单引号。像这样CALL&nbsp;User_ByEmail('?');当输入参数的类型为 时VARCHAR,您应该始终在值周围使用单引号。
随时随地看视频慕课网APP

相关分类

Go
我要回答