【问题标题】:Go MySQL stored procedure cannot return result setGo MySQL 存储过程无法返回结果集
【发布时间】:2014-02-06 22:12:48
【问题描述】:

如果我运行以下代码,但将“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
}

【问题讨论】:

  • 如何调用程序? CALL MobiFit.User_ByEmail('email@domain.com')?
  • 对,就是这么称呼它

标签: mysql go


【解决方案1】:

尝试使用单个 qoutes。

喜欢这个

CALL User_ByEmail('?');

当输入参数为VARCHAR 类型时,您应该始终在值周围使用单引号。

【讨论】:

  • 好的,我做到了,我现在得到panic: sql: statement expects 0 inputs; got 1 [recovered] panic: sql: statement expects 0 inputs; got 1
  • 你能在, Email变量中添加''吗?你能尝试确定最终的语法是什么吗?
  • 我将调用切换到行,err := db.Query("CALL User_ByEmail('lee@g.com')") 现在我遇到了原始错误
  • 在我看来这不是 MySQL 的问题。这和你的问题有关吗? stackoverflow.com/questions/2842263/…
  • 我猜这个驱动肯定有bug。
【解决方案2】:

目前使用 MySQL 不能调用存储过程,显然也不能一次执行多条语句。

http://go-database-sql.org/surprises.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 2011-04-22
    相关资源
    最近更新 更多