gpt4 book ai didi

mysql - 在 C 应用程序中调用 MySQL 存储过程出错

转载 作者:太空宇宙 更新时间:2023-11-03 23:46:25 25 4
gpt4 key购买 nike

我想在用 C 编写的应用程序中使用 MySQL 的 CURSOR

我创建了一个存储过程

CREATE PROCEDURE curdemo(IN id INT)
BEGIN
DECLARE a INT;
DECLARE flag BOOL DEFAULT FALSE;
DECLARE done INT DEFAULT FALSE;
DECLARE cur1 CURSOR FOR SELECT test.Cars.Id FROM test.Cars;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cur1;

read_loop: LOOP
FETCH cur1 INTO a;
IF done THEN
LEAVE read_loop;
END IF;

IF flag THEN
SELECT test.Cars.Price FROM test.Cars WHERE test.Cars.id = a;
LEAVE read_loop;
END IF;

IF a = id THEN
SET flag = TRUE;
END IF;
END LOOP;

CLOSE cur1;
END//

这是我在数据库测试中名为 Cars 的表

+------+------------+--------+

| Id | Name | Price |

+------+------------+--------+

| 1 | Audi | 52642 |

| 2 | Mercedes | 57127 |

| 3 | Skoda | 9000 |

| 4 | Volvo | 29000 |

| 5 | Bentley | 350000 |

| 6 | Citroen | 21000 |

| 7 | Hummer | 41400 |

| 8 | Volkswagen | 21600 |

+------+------------+--------+

当我在 C 应用程序中使用以下查询时,我得到结果 = NULL,因此仅当 id = 8 时出现段错误,否则它工作正常

 snprintf(statement, 100, "CALL curdemo('%d')", id);
// Call stored procedure query
if ( mysql_query(device_table_conn, statement) )
{
error_function(device_table_conn);
//return 1;
}

result = mysql_use_result(device_table_conn);

mysql_use_result() 如果发生错误则返回 NULL

但如果 CALL 返回 NULL 或空结果,它不应返回 NULL。

最佳答案

终于明白了。

按照给出的步骤处理多个语句: https://dev.mysql.com/doc/refman/5.0/en/c-api-multiple-queries.html

这是代码

    snprintf(statement, 100, "CALL curdemo('%d')", id);
if ( mysql_query(device_table_conn, statement) )
{
error_function(device_table_conn);
//return 1;
}

do{
// did current statement return data?
result = mysql_store_result(device_table_conn);
if (result)
{
// yes; process rows and free the result set
num_fields = mysql_num_fields(result);

while ((row = mysql_fetch_row(result)))
{
for ( i = 0; i < num_fields; i++ )
{
printf("%s\n", row[i]);
}
}

mysql_free_result(result);
}
else
{
mysql_free_result(result);
}
// more results? -1 = no, >0 = error, 0 = yes (keep looping)
if ((status = mysql_next_result(device_table_conn)) > 0)
{
;
}
} while (status == 0);

mysql_close(device_table_conn);

这里它不会为任何错误的 id(不存在于表中)和当 id = 8 时返回任何内容。

关于mysql - 在 C 应用程序中调用 MySQL 存储过程出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32142234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com