mysql中使用函数实现遍历查询结果

本文介绍了一种在没有层级字段的情况下,使用SQL函数递归查询树形结构数据的方法,通过连接父节点名称实现层级展示,适用于多级菜单或组织架构的展示需求。

在最近工作中遇到一个树形结构,然后在表单上展示的时候需要把所有的父级用/隔开,但是在起初设置数据库的时候没有字段来标注当前节点是第几级。所以用函数来实现这个功能。

CREATE FUNCTION genParent(name varchar(20)) RETURNS varchar(50)
BEGIN
	DECLARE depositName VARCHAR(255) DEFAULT '';
	DECLARE sTemp VARCHAR(255) DEFAULT '';
	DECLARE num INT(255)DEFAULT 0;

	SET sTemp = '';

	WHILE deposit !='PLA0' AND deposit is not NULL AND deposit != '' DO
	SELECT a.name INTO sTemp FROM t_address_deposit a WHERE a.oid = deposit and a.display = 1;
	SELECT a.parentId INTO deposit FROM t_address_deposit a WHERE a.oid = deposit and a.display = 1;
	IF num = 0 THEN 
	set depositName = CONCAT(sTemp,depositName);
	ELSE set depositName = CONCAT_WS("/",sTemp,depositName);
	end if;
	set num = num +1;
	END WHILE;

	RETURN depositName;
END

 

使用 C++ Builder 调用 MySQL 动态库实现数据库查询结果遍历时,需要完成以下几个关键步骤:加载 MySQL 的动态链接库(DLL),初始化客户端连接,执行 SQL 查询,并对结果进行处理。 首先,确保系统中已安装 MySQL Connector 或者至少包含 `libmysql.dll` 文件。该 DLL 提供了与 MySQL 数据库通信所需的函数接口。通常,C++ Builder 支持通过 `LoadLibrary` 和 `GetProcAddress` 机制来动态调用这些函数。 ### 连接数据库 通过动态库建立数据库连接时,需调用 `mysql_init` 初始化一个 MYSQL 结构体实例,然后使用 `mysql_real_connect` 建立实际的连接。这一步骤涉及传递主机名、用户名、密码以及目标数据库名称等信息[^3]。 ```cpp typedef MYSQL* (*MysqlInit)(MYSQL *mysql); typedef my_bool (*MysqlRealConnect)(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag); HMODULE hLib = LoadLibrary("libmysql.dll"); if (hLib) { MysqlInit mysql_init = (MysqlInit)GetProcAddress(hLib, "mysql_init"); MysqlRealConnect mysql_real_connect = (MysqlRealConnect)GetProcAddress(hLib, "mysql_real_connect"); MYSQL* conn = mysql_init(NULL); if (mysql_real_connect(conn, "localhost", "root", "password", "testdb", 3306, NULL, 0)) { // Connection successful } else { // Handle connection error } } ``` ### 执行查询 成功连接后,可使用 `mysql_query` 函数发送 SQL 查询语句至服务器。此函数返回一个整数表示操作是否成功,非零值表示发生错误[^3]。 ```cpp typedef int (*MysqlQuery)(MYSQL *mysql, const char *stmt_str); MysqlQuery mysql_query = (MysqlQuery)GetProcAddress(hLib, "mysql_query"); int result = mysql_query(conn, "SELECT id, name FROM users"); if (result != 0) { // Handle query error } ``` ### 遍历结果查询成功后,通过 `mysql_store_result` 获取完整的查询结果集。接着,可以使用 `mysql_fetch_row` 按行读取每一项记录[^3]。 ```cpp typedef MYSQL_RES* (*MysqlStoreResult)(MYSQL *mysql); typedef MYSQL_ROW (*MysqlFetchRow)(MYSQL_RES *result); MysqlStoreResult mysql_store_result = (MysqlStoreResult)GetProcAddress(hLib, "mysql_store_result"); MysqlFetchRow mysql_fetch_row = (MysqlFetchRow)GetProcAddress(hLib, "mysql_fetch_row"); MYSQL_RES* res = mysql_store_result(conn); if (res) { while (MYSQL_ROW row = mysql_fetch_row(res)) { std::cout << "ID: " << row[0] << ", Name: " << row[1] << std::endl; } // Free result set mysql_free_result(res); } ``` ### 清理资源 最后,应释放所有分配的资源,包括关闭连接和卸载动态库。 ```cpp typedef void (*MysqlClose)(MYSQL *sock); MysqlClose mysql_close = (MysqlClose)GetProcAddress(hLib, "mysql_close"); mysql_close(conn); FreeLibrary(hLib); ``` 以上代码片段展示了如何利用 C++ Builder 中的动态库功能调用 MySQL API 实现数据库访问的基本流程。需要注意的是,在实际应用开发过程中还需考虑异常处理、内存管理以及安全性问题,例如防止 SQL 注入攻击等。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值