创建MySQL无限循环

时间:2015-01-27 17:39:07

标签: c++ mysql mysql-connector

我正在为项目创建测试函数,该项目独立于数据库中当前的数据而工作。具体来说,我想要一个演示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

2 个答案:

答案 0 :(得分:1)

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