代码之家  ›  专栏  ›  技术社区  ›  J S

mysql:传递过程参数以使用语句执行

  •  5
  • J S  · 技术社区  · 17 年前

    这是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
    

    谢谢!

    1 回复  |  直到 17 年前
        1
  •  2
  •   ChssPly76    17 年前

    我认为您不需要在参数持有者周围加双引号。

    更新 在这里,以免产生误解:

    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;
    //