【发布时间】:2015-08-21 13:59:06
【问题描述】:
我想在一个用 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。
【问题讨论】:
-
你为什么要使用游标?
-
在使用游标之前,我正在获取所有表信息,然后检查匹配条件,但我在某处读取游标为同一事物提供了更好的结果,而不是仅获取行或获取所有表我需要的结果。这只是一个测试用例。我的实际表格有更多数据。我说的对吗?
-
我没有测试游标和简单查询,但是我在 mysql.com 论坛上看到游标性能不佳,只有游标可以提供帮助时才应该使用它们。
-
嗨,Devart,你能给我链接来支持你的回复吗?感谢您的回复。