2013-02-15 81 views
2

该函数返回NULL:SELECT ... INTO存储过程

CREATE FUNCTION `GetCardID`(numId INT) RETURNS int(11) 
    DETERMINISTIC 
BEGIN 
    DECLARE retcard INT(11); 
    SELECT id 
    INTO retcard 
    FROM cards 
    WHERE `number` = numId 
     AND enabled = 1 
    LIMIT 1; 
    RETURN retcard; 
END 

始终返回null,即使查询:

SELECT id FROM cards WHERE `number`=<Insert Value Here> AND ENABLED = 1 LIMIT 1; 

返回用于相同值的有效值和函数参数。

例如:
SELECT ID FROM cards WHERE number = 12345 AND ENABLED = 1 LIMIT 1;
- 返回的ID,而
GetCardId(12345);
- 返回null

任何想法,我在这里失踪?我认为自己在SQL方面非常熟练,但在SP上略显绿色。

+0

只是问,你使用'delimiter $$'? – jcho360 2013-02-15 17:55:57

+0

是的,我正在使用备用分隔符语法(我相信如果没有它,create语句会失败)。公平的问题,但。 – 2013-02-15 19:41:59

回答

1

你正在进入你的函数的数据有多大?这个数字是否大于适合进入INT的数量?

+0

_Kicking myself_ 谢谢约翰·A·冈萨雷斯,原来的实际数字,我传递的12位(会员卡),数字稍微超过一个INT的10位数字。 MySQL必须一直安静地转换输入,而不发出任何wanring或错误。 – 2013-02-26 21:38:33

0

Always returns NULL

摆脱的过程定义DETERMINISTIC条款。 MySQL缓存来自这些过程或函数的响应。从MySQL

摘录:

的例程被认为是“确定性的”,如果它总是产生相同的结果 对于相同的输入参数,以及“不确定性” 否则。如果在 中既没有给出DETERMINISTIC也没有给出DETERMINISTIC,则默认为NOT DETERMINISTIC。要声明 一个函数是确定性的,你必须指定确定性 明确

MySQL 5.5 - Creating Procedure or Function

+0

不幸的是,我的服务器(我不是管理员)的配置需要使用DETERMINISTIC,NO SQL或READS SQL DATA。所以这将是我被锁定的东西。 – 2013-02-15 19:44:40

+0

另外,根据您引用的定义,此函数应该符合确定性...任何给定的输入数字应始终返回相同的id值。 – 2013-02-15 19:52:46

2

克里斯托弗这里是你的函数。试试这个,它应该可以工作:

CREATE FUNCTION [dbo].[GetCardID] 
( 
    @Num_ID INT 

) 
RETURNS int 
AS 
BEGIN 
    declare @retcard int  

    select Top 1 @retcard = id 
    FROM cards 
    where number = @num_Id 
    AND enabled = 1 

    return @retcard 



END