2016-08-21 4 views
1

In MySQL-Datenbank habe ich eine Tabelle namens 'usertest', die einige Benutzerinformationen gespeichert hat. Und ich erstelle eine UDF namens 'getId' erfolgreich. Dies ist, wie es erstellt:Aufruf einer gespeicherten Funktion in mysql, aber ein Fehler: Unterabfrage gibt mehr als 1 Zeile zurück

create function getId(name varchar(255)) 
returns int 
begin 
declare id_found int; 
set id_found=(select Id from usertest where Name=name); 
return id_found; 
end 

Es sollte OK.However sein, wenn ich

select getId('mike'); 

mysql-Engine einen Fehler meldet rufen:

Subquery returns more than 1 row. 

Aber in Tabelle

usertest Ich habe nur eine Zeile, wo Name = "mike". Das ist verdrahtet. Jemand kann mir sagen, warum? Vielen Dank im Voraus :)

Antwort

3

Spaltennamen und Variablen sind case-insensitive, so Name und name sind die gleiche Sache. Es vergleicht nicht die Name Spalte mit der name Variable, es vergleicht die name Variable mit sich selbst, also ist es immer wahr.

Verwenden Sie einen anderen Namen für den Funktionsparameter.

create function getId(name_param varchar(255)) 
returns int 
begin 
declare id_found int; 
set id_found=(select Id from usertest where Name=name_param); 
return id_found; 
end 

oder verwenden Sie ein Tabellenname-Präfix.

create function getId(name varchar(255)) 
returns int 
begin 
declare id_found int; 
set id_found=(select Id from usertest where usertest.Name=name); 
return id_found; 
end 

Siehe MySQL : When stored procedure parameter name is the same as table column name

+0

Dies funktioniert für mich! Und danke dir! :) –

+0

@ 吴 环宇 Akzeptieren Sie bitte mit dem grünen Häkchen: p (es ist rechts unter den Pfeilen nach unten) ... das grüne Ding auf der [Tour] (http://stackoverflow.com/tour) Seite – Drew

+0

Und danke Barmar für eine nachdenkliche Antwort. – Drew

Verwandte Themen