MySQL:将过程参数传递给EXECUTE USING语句

5 mysql stored-procedures

这是MySQL 5.1.

(注意:我意识到有更好的方法来做这个特定的例子,这不是我真正的代码)

这是我想要做的:下面的过程被创建,但是当我调用它时,我得到"ERROR 1210(HY000):EXECUTE的参数不正确"

 DELIMITER //
 CREATE PROCEDURE get_users_by_state(IN state CHAR(2))
 READS SQL DATA
 BEGIN
 SET @mystate = state;
 SET @sql = CONCAT('SELECT * FROM test_table WHERE state = "?"');
 PREPARE stmt FROM @sql;
 EXECUTE stmt USING @mystate;
 END;
 //

 CALL get_users_by_state('AA')//
 ERROR 1210 (HY000): Incorrect arguments to EXECUTE
Run Code Online (Sandbox Code Playgroud)

有没有办法将过程的参数传递给EXECUTE USING语句?这是一个确实有效的版本,但让我感到烦恼:

CREATE PROCEDURE get_users_by_state(IN state CHAR(2))
READS SQL DATA
BEGIN
SET @sql = CONCAT('SELECT * FROM test_table WHERE state = "', state, '"')
PREPARE stmt FROM @sql;
EXECUTE stmt;
END;
//
Run Code Online (Sandbox Code Playgroud)

作为一个侧面问题,MySQL是否有任何转义字符串的工具,比如Postgres的quote_literal()和quote_ident()?

作为参考,这里有一些与Postgres相同的东西:

CREATE OR REPLACE FUNCTION get_info_by_state(character)
  RETURNS SETOF ret_type AS
$BODY$
DECLARE
    sql text;
BEGIN
    sql := 'SELECT uid, some_data FROM test_table WHERE state = ' || quote_literal($1);
    RETURN QUERY EXECUTE sql;
END
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
Run Code Online (Sandbox Code Playgroud)

谢谢!

Chs*_*y76 3

我认为参数持有者不需要双引号。

更新一下,以免误会:

DELIMITER //
CREATE PROCEDURE get_users_by_state(IN state CHAR(2))
READS SQL DATA
BEGIN
SET @mystate = state;
SET @sql = CONCAT('SELECT * FROM test_table WHERE state = ?');
PREPARE stmt FROM @sql;
EXECUTE stmt USING @mystate;
END;
//
Run Code Online (Sandbox Code Playgroud)