Mysql实现Oracle中的Start with...Connect by方式
Mysql Oracle中的Start with...Connect by
工作需要,迁移数据库时发现使用了Oracle中的start with来进行树的递归查询,所以自己动手丰衣足食。
通过一番搜索后发现
大家的实现基本都是这样的:
CREATE FUNCTION queryChildrenAreaInfo(areaId INT) RETURNS VARCHAR(4000) BEGIN DECLARE sTemp VARCHAR(4000); DECLARE sTempChd VARCHAR(4000); SET sTemp='$'; SET sTempChd = CAST(areaId AS CHAR); WHILE sTempChd IS NOT NULL DO SET sTemp= CONCAT(sTemp,',',sTempChd); SELECT GROUP_CONCAT(id) INTO sTempChd FROM t_areainfo WHERE FIND_IN_SET(parentId,sTempChd)>0; END WHILE; RETURN sTemp;
但是这样的代码没法复用(而且我的navicat居然建立函数失败,或者各种错误,所以我使用了存储过程,效果一样),所以我们使用set和execute来进行语句的拼接和执行,
修改后
如下:
CREATE PROCEDURE getChildList
IN rootId DECIMAL(65),
IN tablesname VARCHAR(6000),
OUT sTemp VARCHAR(6000)
BEGIN
DECLARE sTempChd VARCHAR(4000);
SET sTemp='$';
SET sTempChd = CAST(rootId AS CHAR);
WHILE sTempChd IS NOT NULL DO
SET sTemp= CONCAT(sTemp,',',sTempChd);
set @sqlexe = concat("SELECT GROUP_CONCAT(id) INTO sTempChd FROM " , tablesname , " WHERE FIND_IN_SET(parentId,sTempChd)>0;")
prepare sqlexe from @sqlexe;
execute sqlexe;
END WHILE;
END;这样一来我们就可以将表名作为参数传入,但是一番执行后,你会发现,哦豁,它居然报了这样一个错:
1327 - Undeclared variable: sTempChd;
这个低级错误困扰了我半天,我不是声明了sTempChd为declare吗?
答案很简单
预处理语句(也就是我们的prepare)中,只接受@声明的参数。因为在存储过程中,使用动态语句,预处理时,动态内容必须赋给一个会话变量,也就是@形式声明的变量,而declare声明的是存储过程变量,具体的内容涉及到更深的知识,我暂时无法找到原因。
前文是自上而下的查询,自下而上的查询其实很简单,只要替换一下参数和语句内容就可以了,
具体如下:
CREATE PROCEDURE `getParentList`(
IN rootId DECIMAL(65,0),
IN tablesname VARCHAR ( 500 ),
OUT sTemp VARCHAR ( 6000 ) )
BEGIN
DECLARE
PARENTID DECIMAL(65);
SET sTemp = '$';
SET @sTempChd = cast(rootId as char);
WHILE @sTempChd <> 0 DO
SET sTemp = concat( sTemp, ',', @sTempChd );
SET @sqlcmd = CONCAT("SELECT PARENTID into @sTempChd FROM " , tablesname , " WHERE CATEID = " , @sTempChd , ";");
PREPARE stmt FROM @sqlcmd;
EXECUTE stmt;
END WHILE;
DEALLOCATE PREPARE stmt;
END别忘了,最后要执行一下deallocate语句,释放预处理sql,免得session的预处理语句过多,达到max_prepared_stmt_count的上限值。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
在 Windows 10 上安装 解压缩版 MySql(推荐)
这篇文章主要介绍了在 Windows 10 上安装 解压缩版 MySql(推荐)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下2016-12-12
MySQL 中的 SQL_MODE 设置方法ANSI_QUOTES 选项解析与应用小结
sql_mode是 MySQL 中的一个系统变量,用于控制 SQL 语句的解析和执行方式,它由多个选项组成,每个选项都可以独立设置,以满足不同的应用场景需求,这篇文章主要介绍了MySQL 中的 SQL_MODE 设置:ANSI_QUOTES 选项解析与应用2024-12-12
MySQL定位长事务(Identify Long Transactions)的实现
在MySQL的运行中,经常会遇到一些长事务,本文主要介绍了MySQL定位长事务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2024-09-09


最新评论