MySQL: передача параметров процедуры в оператор EXECUTE USING - PullRequest
5 голосов
/ 16 июля 2009

Это MySQL 5.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 какие-либо средства для экранирования строк, такие как quote_literal () и quote_ident () из Postgres?

Для справки, вот что-то несколько эквивалентное для 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

Спасибо!

1 Ответ

2 голосов
/ 16 июля 2009

Не думаю, что вам нужны двойные кавычки вокруг держателя параметра.

Обновление Здесь, чтобы не было недопонимания:

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;
//
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...