使用Erlang / OTP ODBC驱动程序和mySQL时,我收到了可重现的错误。仅当使用odbc:param_query()以IN变量调用存储过程时才会收到错误。仅在连续的param_query调用上发生错误。
错误是:{错误,“[MySQL] [ODBC 5.2(a)驱动程序] [mysqld-5.6.37-log]命令不同步;您现在无法运行此命令SQLSTATE IS:HY000”}
mySQL文档说错误是在使用C代码mysql_store_result()时引起的,而不是由mysql_free_result()跟进它。我相信这是Erlang方面的ODBC驱动程序的问题,或者我没有正确使用param_query。
我找到的简单解决方案是在我使用的每个param_query之前不使用param_query或使用sql_query。
完整示例:
SQL:
DROP PROCEDURE if exists test_stored_procedure;
delimiter |
CREATE PROCEDURE `test_stored_procedure`(IN n INT)
BEGIN
SELECT 1;
END
| delimiter ;
二郎:
-module(odbc_test).
-compile(export_all).
connect() ->
{ok, Conn} = odbc:connect("DSN=myodbc", []),
Conn.
do_param_query(Conn, N) ->
odbc:param_query(Conn, "Call test_stored_procedure(?);", [{sql_integer, [N]}]).
do_sql_query(Conn, N) ->
odbc:sql_query(Conn, "Call test_stored_procedure("++ integer_to_list(N)++");").
测试:
96> odbc:start().
ok
97> Conn = odbc_test:connect().
<0.237.0>
98> odbc_test:do_param_query(Conn,3).
{selected,["1"],[{"1"}]}
99> odbc_test:do_param_query(Conn,3).
{error,"[MySQL][ODBC 5.2(a) Driver][mysqld-5.6.37-log]Commands out of sync; you can't run this command now SQLSTATE IS: HY000"}
100> odbc_test:do_param_query(Conn,3).
{error,"[MySQL][ODBC 5.2(a) Driver][mysqld-5.6.37-log]Commands out of sync; you can't run this command now SQLSTATE IS: HY000"}
101> odbc_test:do_sql_query(Conn,3).
[{selected,["1"],[{"1"}]},{updated,0}]
102> odbc_test:do_param_query(Conn,3).
{selected,["1"],[{"1"}]}
103> odbc_test:do_param_query(Conn,3).
{error,"[MySQL][ODBC 5.2(a) Driver][mysqld-5.6.37-log]Commands out of sync; you can't run this command now SQLSTATE IS: HY000"}
如果您知道导致错误的原因,请告知。