创建 MySQL 无限循环
Create MySQL infinite loop
我正在为一个独立于数据库中当前数据的项目创建测试函数。具体来说,我想要一个演示 OPT_READ_TIMEOUT 正在运行的测试用例。我发现 MySQL 有 while 语句,我想我会做一个 OPT_READ_TIMEOUT 停止
的无限循环
我从参考手册中几乎逐字复制了语法:http://dev.mysql.com/doc/refman/5.6/en/while.html
但下面的代码会导致错误:SQLException 您的 SQL 语法有误;查看与您的 MySQL 服务器版本相对应的手册,了解在第 1 行 'CREATE PROCEDURE dowhile() BEGIN DECLARE v1 INT DEFAULT 5; WHILE v1 > 0 DO SET v' 附近使用的正确语法(MySQL 错误代码:1064,SQL状态: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 No database selected (MySQL error code: 1046, SQL状态:3D000)
以上不是无限循环,我一直在尝试让 while 循环工作。理想情况下,它会永远循环,不需要提及任何特定的数据库、表等。
如果它很重要,我使用 MySQL 版本 5.6.22 用于 Linux
问题是您试图在单个语句中执行多个查询,即 USE
和 CREATE PROCEDURE
。尝试在单独的后续查询中使用它们。
或者,您可以通过将数据库名称添加到对象名称来 "qualify" 名称,例如 orderdata.dowhile
.
我以前没有任何使用 MySQL 函数或过程的经验,但我设法创建了一个总是会导致 OPT_READ_TIMEOUT 被触发的东西。我想我会 post 因为它有效但如果其他人可以改进它我会接受 anser
如果不用数据库就好了/table
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;"
我正在为一个独立于数据库中当前数据的项目创建测试函数。具体来说,我想要一个演示 OPT_READ_TIMEOUT 正在运行的测试用例。我发现 MySQL 有 while 语句,我想我会做一个 OPT_READ_TIMEOUT 停止
的无限循环我从参考手册中几乎逐字复制了语法:http://dev.mysql.com/doc/refman/5.6/en/while.html
但下面的代码会导致错误:SQLException 您的 SQL 语法有误;查看与您的 MySQL 服务器版本相对应的手册,了解在第 1 行 'CREATE PROCEDURE dowhile() BEGIN DECLARE v1 INT DEFAULT 5; WHILE v1 > 0 DO SET v' 附近使用的正确语法(MySQL 错误代码:1064,SQL状态: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 No database selected (MySQL error code: 1046, SQL状态:3D000)
以上不是无限循环,我一直在尝试让 while 循环工作。理想情况下,它会永远循环,不需要提及任何特定的数据库、表等。
如果它很重要,我使用 MySQL 版本 5.6.22 用于 Linux
问题是您试图在单个语句中执行多个查询,即 USE
和 CREATE PROCEDURE
。尝试在单独的后续查询中使用它们。
或者,您可以通过将数据库名称添加到对象名称来 "qualify" 名称,例如 orderdata.dowhile
.
我以前没有任何使用 MySQL 函数或过程的经验,但我设法创建了一个总是会导致 OPT_READ_TIMEOUT 被触发的东西。我想我会 post 因为它有效但如果其他人可以改进它我会接受 anser
如果不用数据库就好了/table
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;"