Mysql實現(xiàn)Oracle中的Start with...Connect by方式
Mysql Oracle中的Start with...Connect by
工作需要,遷移數(shù)據(jù)庫時發(fā)現(xiàn)使用了Oracle中的start with來進行樹的遞歸查詢,所以自己動手豐衣足食。
通過一番搜索后發(fā)現(xiàn)
大家的實現(xiàn)基本都是這樣的:
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;
但是這樣的代碼沒法復(fù)用(而且我的navicat居然建立函數(shù)失敗,或者各種錯誤,所以我使用了存儲過程,效果一樣),所以我們使用set和execute來進行語句的拼接和執(zhí)行,
修改后
如下:
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;這樣一來我們就可以將表名作為參數(shù)傳入,但是一番執(zhí)行后,你會發(fā)現(xiàn),哦豁,它居然報了這樣一個錯:
1327 - Undeclared variable: sTempChd;
這個低級錯誤困擾了我半天,我不是聲明了sTempChd為declare嗎?
答案很簡單
預(yù)處理語句(也就是我們的prepare)中,只接受@聲明的參數(shù)。因為在存儲過程中,使用動態(tài)語句,預(yù)處理時,動態(tài)內(nèi)容必須賦給一個會話變量,也就是@形式聲明的變量,而declare聲明的是存儲過程變量,具體的內(nèi)容涉及到更深的知識,我暫時無法找到原因。
前文是自上而下的查詢,自下而上的查詢其實很簡單,只要替換一下參數(shù)和語句內(nèi)容就可以了,
具體如下:
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別忘了,最后要執(zhí)行一下deallocate語句,釋放預(yù)處理sql,免得session的預(yù)處理語句過多,達到max_prepared_stmt_count的上限值。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
mysql中GROUP_CONCAT函數(shù)使用技巧及問題詳解
這篇文章主要給大家介紹了關(guān)于mysql中GROUP_CONCAT函數(shù)使用技巧及問題的相關(guān)資料,GROUP_CONCAT是MySQL中的一個聚合函數(shù),它用于將多行數(shù)據(jù)按照指定的順序連接成一個字符串并返回結(jié)果,需要的朋友可以參考下2023-11-11
Explain命令在優(yōu)化查詢中的實際應(yīng)用
在MySQL中,EXPLAIN命令是一種非常重要的查詢優(yōu)化工具,它可以幫助我們分析SQL查詢語句的執(zhí)行計劃,以及如何優(yōu)化它們。本文介紹了Explain命令在優(yōu)化查詢中的實際應(yīng)用,感興趣的小伙伴可以參考閱讀2023-04-04
MySQL 客戶端不輸入用戶名和密碼直接連接數(shù)據(jù)庫的2個方法
MySQL 客戶端不輸入用戶名和密碼直接連接數(shù)據(jù)庫的2個方法,大家可以測試下。2009-07-07
Mysql update多表聯(lián)合更新的方法小結(jié)
這篇文章主要介紹了Mysql update多表聯(lián)合更新的方法小結(jié),通過實例代碼給大家介紹了mysql多表關(guān)聯(lián)update的語句,感興趣的朋友跟隨小編一起看看吧2020-02-02
虛擬機linux端mysql數(shù)據(jù)庫無法遠程訪問的解決辦法
最近在項目搭建過程中遇到一問題,有關(guān)虛擬機linux端mysql數(shù)據(jù)庫無法遠程訪問,通過查閱相關(guān)數(shù)據(jù)庫資料問題解決,下面把具體的解決辦法分享給大家,有需要的朋友可以參考下2015-08-08

