簡體   English   中英

Go MySQL 存儲過程無法返回結果集

[英]Go MySQL stored procedure cannot return result set

如果我運行下面的代碼,但用"SELECT * FROM User LIMIT 1"替換“CALL”,我會得到一個用戶。 如果我切換到調用存儲過程,我會不斷收到此錯誤:

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
}

使用 MySQL,您當前不能調用存儲過程,也不能一次執行多個語句。

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

嘗試使用單引號。

像這樣

CALL User_ByEmail('?');

當輸入參數的類型為VARCHAR ,您應該始終在值周圍使用單引號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM