[英]mysql stored procedure with parameters problem
我创建了以下过程。
DELIMITER ;;
DROP PROCEDURE IF EXISTS getAllPortfoliosDemo;;
CREATE PROCEDURE getAllPortfoliosDemo( IN keyid INT(10))
BEGIN
DECLARE whereString char(100);
IF (keyid > 0 ) THEN
SET whereString = CONCAT( ' WHERE pkid = ', keyid );
ELSE
SET whereString = ' WHERE 1 ';
END IF;
SELECT pkid, title FROM Portfolio whereString;
END ;;
该查询没有返回错误。 没有参数,效果很好。 对于例如CALL getAllPortfoliosDemo(); 作品。 但它不适用于参数。 对于例如CALL getAllPortfoliosDemo(5); 没有返回任何行。
我也尝试了以下替代查询
DELIMITER ;;
DROP PROCEDURE IF EXISTS getAllPortfoliosDemo;;
CREATE PROCEDURE getAllPortfoliosDemo( IN keyid INT(10))
BEGIN
DECLARE whereString char(100) DEFAULT NULL;
IF (keyid > 0 ) THEN
SET whereString = CONCAT( ' AND pkid = ', keyid );
END IF;
SET @SQLstmt = CONCAT('SELECT pkid, title FROM Portfolio ', whereString) ;
PREPARE SQLbase FROM @SQLstmt;
EXECUTE SQLbase;
DEALLOCATE PREPARE SQLbase;
END ;;
这也没有返回任何结果集。 任何人都可以采用一种方法。 提前致谢
SELECT pkid, title
FROM Portfolio whereString;
这样,您的whereString
变量将转换为BOOLEAN
并始终求值为true,因为它不是空的。
IF (keyid > 0 ) THEN
SET whereString = CONCAT( ' AND pkid = ', keyid );
END IF;
SET @SQLstmt = CONCAT('SELECT pkid, title FROM Portfolio ', whereString)
对于大于0
值,这将失败,因为它导致以下语句:
SELECT pkid, title
FROM Portfolio
WHERE AND pkid = $keyid
-- ^
-- Wrong!
只需使用以下语句:
SELECT pkid, title
FROM Portfolio
WHERE pkid = keyid
UNION ALL
SELECT pkid, title
FROM Portfolio
WHERE keyid = 0
这将优化出SELECT
查询之一,并且效率很高。
是。 Quassnoi很好地回答了这个问题。 非常感谢他。 我已将查询修改为
DELIMITER ;;
DROP PROCEDURE IF EXISTS getAllPortfoliosDemo;;
CREATE PROCEDURE getAllPortfolios( IN keyid INT(10))
BEGIN
DECLARE whereString char(100) DEFAULT NULL;
IF (keyid > 0 ) THEN
SET whereString = CONCAT( ' WHERE 1 AND pkid = ', keyid );
ELSE
SET whereString = ' WHERE 1 ';
END IF;
SET @SQLstmt = CONCAT('SELECT pkid, title FROM Portfolio ', whereString) ;
PREPARE SQLbase FROM @SQLstmt;
EXECUTE SQLbase;
DEALLOCATE PREPARE SQLbase;
END ;;
因此,“ CALL getAllPortfoliosDemo(0)”将返回所有记录,而“ CALL getAllPortfoliosDemo(5)”将返回第五行
查询
CREATE PROCEDURE getAllPortfoliosDemo( IN keyid INT(10))
BEGIN
SELECT pkid, title
FROM Portfolio
WHERE pkid = keyid
UNION ALL
SELECT pkid, title
FROM Portfolio
WHERE pkid = 0;
END ;;
太有用了。 但是这里的'CALL getAllPortfoliosDemo(0)'不返回任何记录,因为我们没有主键ID为'0'的记录。 getAllPortfoliosDemo(5)正常工作
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.