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