MySQL 存储函数没有返回正确的值
MySQL stored function isn't returning the correct value
为什么 MySQL 中的 SELECT
语句 1 return 结果正确,而 SELECT
中的语句相同MySQL 2 return table_a
中最新行的 id
存储函数?我尝试用实际使用的值替换存储函数中的参数,它仍然 returned table_a
.
中最新行的 id
MySQL 1
USE `schema_a`;
SELECT `id`
FROM `table_a`
WHERE `name` = 'AAA'
AND `type_id` = 1
AND `active` = 1
ORDER BY `created_on` DESC
LIMIT 1;
SELECT `id`
FROM `table_a`
WHERE `name` = 'BBB'
AND `type_id` = 1
AND `active` = 1
ORDER BY `created_on` DESC
LIMIT 1;
SELECT `id`
FROM `table_a`
WHERE `name` = 'CCC'
AND `type_id` = 2
AND `active` = 1
ORDER BY `created_on` DESC
LIMIT 1;
MySQL 2
USE `schema_a`;
DROP FUNCTION IF EXISTS `test`;
DELIMITER //
CREATE FUNCTION `test`(name VARCHAR(255), type_id INT, active TINYINT)
RETURNS INT
NOT DETERMINISTIC
READS SQL DATA
BEGIN
RETURN
(SELECT `id`
FROM `table_a`
WHERE `name` = name
AND `type_id` = type_id
AND `active` = active
ORDER BY `created_on` DESC
LIMIT 1);
END //
DELIMITER ;
SELECT `test`('AAA', 1, 1);
SELECT `test`('BBB', 1, 1);
SELECT `test`('CCC', 2, 1);
给参数取与列名不同的值,否则有歧义。
DELIMITER //
CREATE FUNCTION `test`(p_name VARCHAR(255), p_type_id INT, p_active TINYINT)
RETURNS INT
NOT DETERMINISTIC
READS SQL DATA
BEGIN
RETURN
(SELECT `id`
FROM `table_a`
WHERE `name` = p_name
AND `type_id` = p_type_id
AND `active` = p_active
ORDER BY `created_on` DESC
LIMIT 1);
END //
DELIMITER ;
为什么 MySQL 中的 SELECT
语句 1 return 结果正确,而 SELECT
中的语句相同MySQL 2 return table_a
中最新行的 id
存储函数?我尝试用实际使用的值替换存储函数中的参数,它仍然 returned table_a
.
id
MySQL 1
USE `schema_a`;
SELECT `id`
FROM `table_a`
WHERE `name` = 'AAA'
AND `type_id` = 1
AND `active` = 1
ORDER BY `created_on` DESC
LIMIT 1;
SELECT `id`
FROM `table_a`
WHERE `name` = 'BBB'
AND `type_id` = 1
AND `active` = 1
ORDER BY `created_on` DESC
LIMIT 1;
SELECT `id`
FROM `table_a`
WHERE `name` = 'CCC'
AND `type_id` = 2
AND `active` = 1
ORDER BY `created_on` DESC
LIMIT 1;
MySQL 2
USE `schema_a`;
DROP FUNCTION IF EXISTS `test`;
DELIMITER //
CREATE FUNCTION `test`(name VARCHAR(255), type_id INT, active TINYINT)
RETURNS INT
NOT DETERMINISTIC
READS SQL DATA
BEGIN
RETURN
(SELECT `id`
FROM `table_a`
WHERE `name` = name
AND `type_id` = type_id
AND `active` = active
ORDER BY `created_on` DESC
LIMIT 1);
END //
DELIMITER ;
SELECT `test`('AAA', 1, 1);
SELECT `test`('BBB', 1, 1);
SELECT `test`('CCC', 2, 1);
给参数取与列名不同的值,否则有歧义。
DELIMITER //
CREATE FUNCTION `test`(p_name VARCHAR(255), p_type_id INT, p_active TINYINT)
RETURNS INT
NOT DETERMINISTIC
READS SQL DATA
BEGIN
RETURN
(SELECT `id`
FROM `table_a`
WHERE `name` = p_name
AND `type_id` = p_type_id
AND `active` = p_active
ORDER BY `created_on` DESC
LIMIT 1);
END //
DELIMITER ;