不明白为什么

问题描述 投票:0回答:2

我有这个存储函数,应该从我的数据库返回一些东西

CREATE DEFINER=`michele`@`%` FUNCTION `ProssimaDomanda`(`ParamIDQuestionario` INT(20), `ParamSessioneID` VARCHAR(20), `ParamUltimaDomanda` BIGINT(20)) RETURNS bigint(20) unsigned
    READS SQL DATA
BEGIN
    DECLARE Ritorno BIGINT(20) UNSIGNED DEFAULT 0;

    SET Ritorno=(SELECT NextIDDomanda 
        FROM Risposte
        INNER JOIN OpzioniDomande ON Risposte.IDRisposta = OpzioniDomande.IDRisposta
        WHERE 
            Risposte.SessioneID='ParamSessioneID'
                AND
            Risposte.IDQuestionario=ParamIDQuestionario
                AND
            Risposte.IDDomanda=ParamUltimaDomanda);

    /*IF (Ritorno IS NULL) 
        THEN SET Ritorno=(SELECT PrimaDomanda FROM PrimeDomande WHERE IDQuestionario=ParamIDQuestionario);
    END IF;*/


RETURN Ritorno;

END

但是当我打电话给它时:

SELECT ProssimaDomanda(1,1554891825,2);

它返回Null。

做一个正常的选择:

SELECT NextIDDomanda
        FROM Risposte
        INNER JOIN OpzioniDomande ON Risposte.IDRisposta = OpzioniDomande.IDRisposta
        WHERE 
            Risposte.SessioneID='1554891825'
                AND
            Risposte.IDQuestionario=1
                AND
            Risposte.IDDomanda=2;

返回3是正确的。

为什么会这样?

mysql
2个回答
1
投票

在你的函数中,在where子句中,你将ParamSessioneID放在引号内,因此被解释为文字字符串而不是参数值。 将您的功能更改为:

CREATE DEFINER=`michele`@`%` FUNCTION `ProssimaDomanda`
  (`ParamIDQuestionario` INT(20),
   `ParamSessioneID` VARCHAR(20),
   `ParamUltimaDomanda` BIGINT(20)
  )
RETURNS bigint(20) unsigned
    READS SQL DATA
BEGIN
    DECLARE Ritorno BIGINT(20) UNSIGNED DEFAULT 0;

    SET Ritorno=(SELECT NextIDDomanda 
        FROM Risposte
        INNER JOIN OpzioniDomande ON Risposte.IDRisposta = OpzioniDomande.IDRisposta
        WHERE 
            Risposte.SessioneID=ParamSessioneID -- This is where you have your problem!!!!
                AND
            Risposte.IDQuestionario=ParamIDQuestionario
                AND
            Risposte.IDDomanda=ParamUltimaDomanda);

    /*IF (Ritorno IS NULL) 
        THEN SET Ritorno=(SELECT PrimaDomanda FROM PrimeDomande WHERE IDQuestionario=ParamIDQuestionario);
    END IF;*/


RETURN Ritorno;

END

0
投票

实际上,INNER JOIN子句将一个表中的行与其他表中的行匹配,并允许您查询包含两个表中列的行。

© www.soinside.com 2019 - 2024. All rights reserved.