创建 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

问题是您试图在单个语句中执行多个查询,即 USECREATE 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;"