2014-01-17 6 views
3

Если я запустил код ниже, но замените 'CALL' на "SELECT * FROM User LIMIT 1" Я возвращаюсь к пользователю. Если я перехожу к вызову хранимой процедуры, я все время получаю эту ошибку:Go MySQL хранимая процедура не может вернуть результирующий набор

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 
} 
+0

Как вы называете эту процедуру? 'CALL MobiFit.User_ByEmail ('[email protected]')'? –

+0

Да, вот как вы это называете – Lee

ответ

3

Попробуйте использовать одиночные qoutes.

, как это

CALL User_ByEmail('?'); 

Когда входной параметр типа VARCHAR, то вы должны всегда использовать одиночные кавычки вокруг значения.

+0

ОК, я сделал то, что теперь получаю '' 'панику: sql: statement ожидает 0 входов; получил 1 [восстановлено] \t panic: sql: statement ожидает 0 входов; получил 1''' – Lee

+0

Можете ли вы добавить '' в переменную ', Email'? Можете ли вы попытаться определить, что такое окончательный синтаксис? –

+0

Я переключил вызов на строки, err: = db.Query («CALL User_ByEmail ('[email protected] ')») , а теперь я и оригинальная ошибка – Lee

Смежные вопросы