不明白为什么

时间:2019-04-10 10:54:32

标签: mysql

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

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,这是正确的。

为什么会这样?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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