我正在为项目创建测试函数,该项目独立于数据库中当前的数据而工作。具体来说,我想要一个演示OPT_READ_TIMEOUT正在运行的测试用例。我发现MySQL有while语句并且认为我只会做一个OPT_READ_TIMEOUT停止的无限循环
我几乎逐字地从参考手册中复制了语法:http://dev.mysql.com/doc/refman/5.6/en/while.html
但下面的代码会导致错误: SQLException您的SQL语法中有错误;检查与您的MySQL服务器版本相对应的手册,以便在#39; CREATE PROCEDURE dowhile()BEGIN DECLARE v1 INT DEFAULT 5附近使用正确的语法。当v1> 0 DO SET v'在第1行(MySQL错误代码:1064,SQLState:42000)
try
{
sql::Statement* stmt = con->createStatement();
sql::ResultSet* res = stmt->executeQuery(
"USE orderdata; "
"CREATE PROCEDURE dowhile() "
"BEGIN "
"DECLARE v1 INT DEFAULT 5; "
"WHILE v1 > 0 DO "
"SET v1 = v1 - 1; "
"END WHILE; "
"END;"
);
delete res;
delete stmt;
} catch (sql::SQLException &e) {
std::cout << "SQLException " << e.what()
<< " (MySQL error code: " << e.getErrorCode()
<< ", SQLState: " << e.getSQLState() << ")\n";
// Code to deal with timeout
}
如果我没有声明USE orderdata;
,那么我得到 SQLException没有选择数据库(MySQL错误代码:1046,SQLState:3D000)
以上不是一个无限循环,我刚刚试图让while循环工作。理想情况下,它会永远循环,不需要提及特定的数据库,表格等。
如果重要的话,我使用MySQL版本5.6.22 for Linux
答案 0 :(得分:1)
问题是您尝试在单个语句中执行多个查询,即USE
和CREATE PROCEDURE
。尝试在单独的后续查询中使用它们。
或者,您可以&#34;限定&#34;名称通过将数据库名称添加到对象名称,如orderdata.dowhile
。
答案 1 :(得分:0)
我之前没有使用MySQL函数或过程的经验,但我设法创建了一些总是会导致OPT_READ_TIMEOUT被触发的东西。想我会发布它因为它有效但如果其他人可以改进它我会接受那个anser
如果不必使用数据库/表格会很好
try
{
sql::Statement* stmt = con->createStatement();
// Must use some database to avoid an error
stmt->execute("USE orderdata");
stmt->execute("DROP FUNCTION IF EXISTS forever");
stmt->execute(
"CREATE FUNCTION forever() "
"RETURNS INT READS SQL DATA "
"BEGIN "
"WHILE 1 END WHILE; "
"RETURN 1; "
"END;"
);
sql::ResultSet* res = stmt->executeQuery(
"SELECT 1 FROM transaction WHERE forever()"
);
delete res;
delete stmt;
} catch (sql::SQLException &e) {
// Code for dealing with timeout (error 2013) in here
}
修改:当while循环无效时,上述内容似乎不可靠,请将BEGIN ... END
替换为:
"BEGIN "
"DECLARE foo INT DEFAULT 0; "
"WHILE 1 DO "
"SET foo = foo + 1; "
"END WHILE; "
"RETURN 1; "
"END;"