这是MySQL5.1。
(注意:我意识到有更好的方法来做这个特殊的例子,这不是我真正的代码)
我想做的是:
下面的过程将被创建,但当我调用它时,会得到“错误1210(hy000):要执行的参数不正确”
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
是否有方法将过程的参数传递给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;
//
作为一个附带问题,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
谢谢!