我有这个存储函数,应该从数据库中返回一些东西
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,这是正确的。
为什么会这样?
答案 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 子句将一个表中的行与其他表中的行进行匹配,并允许您查询包含两个表中的列的行。