2013-02-15 74 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 
相關問題