我试图创建一个存储过程,我希望在数据库中获取一个随机值,其中表名和我的查询的其他条件是动态的(在存储过程参数中)。
DROP PROCEDURE IF EXISTS `myproc`;
DELIMITER //
CREATE PROCEDURE `myproc`(IN `tablename` VARCHAR(50), IN `isShow` TINYINT(1), IN `isAdd` TINYINT(1))
BEGIN
SET @tname := tablename;
SET @isshow := isShow;
SET @isAdd := isAdd;
SET @pcode := '';
SET @s = CONCAT('SELECT t.pcode
FROM ', @tname, ' AS t
JOIN (SELECT ROUND(RAND() * (SELECT MAX(idx) FROM ', @tname,' )) AS id) AS x
WHERE
t.idx >= x.id AND
t.isShow = ', @isshow,' AND
t.isAdd = ', @isAdd,
' LIMIT 1');
checkhand: WHILE (!@pcode) DO
PREPARE sp_query FROM @s;
EXECUTE sp_query;
DEALLOCATE PREPARE sp_query;
LEAVE checkhand;
END WHILE ;
END //
DELIMITER ;
由于我使用@var作为tablename,因此我引用了此SO并在CONCAT
中创建了我的SQL查询,然后将其作为Stored Procedure
运行。现在,我的表有漏洞,所以我做的是做一个WHILE
循环,直到获得 pcode 值的记录。
我的问题是,它仍然返回空白pcode,这意味着我的@pcode var没有得到查询的返回值。老实说,我不知道如何将我的查询结果存储在预处理语句中,并将其作为存储过程的结果返回。
任何帮助都可以。请指正。不是专业用户。感谢
我的while循环应该这样做:
while (!t.pcode) {
// do query and check if i get t.pcode
return t.pcode
}