如何在mysql的过程中传递值

时间:2014-05-02 14:18:52

标签: mysql

DELIMITER //

DROP PROCEDURE IF EXISTS salary_ref//# MySQL returned an empty result set (i.e. zero rows).
# MySQL returned an empty result set (i.e. zero rows).

CREATE PROCEDURE salary_ref(con int(11),IN id varchar(120),maxval int(11),minval int(11) , taxo int(11))
BEGIN
DECLARE s VARCHAR(50);
IF con = 1 THEN
SELECT `i` . * , `taxo`.`id` , `t`.`item_id` AS id, `u`.`name` AS user_name, `t`.`value` AS val
FROM (
`taxonomy` AS taxo
)
JOIN `item_taxo` AS t ON `t`.`taxo_id` = `taxo`.`id`
INNER JOIN `items` AS i ON `i`.`id` = `t`.`item_id`
INNER JOIN `users` AS u ON `u`.`id` = `i`.`created_by`
WHERE `t`.`value`
BETWEEN minval
AND maxval
AND `t`.`taxo_id` = taxo
AND `i`.`parent_tag_id` in (id);
ELSE
SELECT `i` . * , `taxo`.`id` , `t`.`item_id` AS id, `u`.`name` AS user_name, `t`.`value` AS val
FROM (
`taxonomy` AS taxo
)
JOIN `item_taxo` AS t ON `t`.`taxo_id` = `taxo`.`id`
INNER JOIN `items` AS i ON `i`.`id` = `t`.`item_id`
INNER JOIN `users` AS u ON `u`.`id` = `i`.`created_by`
WHERE `t`.`value`
BETWEEN minval
AND maxval
AND `t`.`taxo_id` = taxo
AND `i`.`parent_tag_id` in (id);
END IF;
END;
//# MySQL returned an empty result set (i.e. zero rows).

DELIMITER ;

//调用那个

调用salary_ref(2,“\'36 \',\'50 \',\'57 \'”,17000000,0,7)

这对我不起作用。

1 个答案:

答案 0 :(得分:1)

以下更改可以解决问题。

更改1
我建议不要对存储过程使用相同的参数名来表示表的列名 除非你正确处理它们,否则会出现标识符冲突,但似乎并不存在。

更改程序签名如下:

CREATE PROCEDURE salary_ref(
  _con int(11), IN csv_id_values varchar(120), 
  _maxval int(11), _minval int(11), _taxo int(11)
)

更改2
您正尝试为id字段传递逗号分隔值,以便在where子句中使用 但是使用转义字符不会解决您的问题,这不是使用输入值的正确方法。

call salary_ref( 2, '36,50,57', 17000000, 0, 7 )

CSV值'36,50,57'可以用作where子句 请参阅下面的建议更改

更改3
您可以在FIND_IN_SET子句中使用IN代替WHERE而不是 WHERE `t`.`value` BETWEEN _minval AND _maxval AND `t`.`taxo_id` = _taxo AND FIND_iN_SET( `i`.`parent_tag_id`, csv_id_values );

IF con

并且,我认为您的程序正文不完整。您的ELSESELECT使用了相同的{{1}}声明。除非你改变它,否则它是多余的。