最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql實(shí)現(xiàn)Oracle中的Start with...Connect by方式

 更新時(shí)間:2024年12月23日 08:59:01   作者:HNT_Wings  
文章總結(jié):作者在遷移數(shù)據(jù)庫時(shí),使用了Oracle的startwith進(jìn)行樹的遞歸查詢,但遇到了一些問題,通過搜索和修改,作者成功地使用存儲(chǔ)過程和預(yù)處理語句來實(shí)現(xiàn)動(dòng)態(tài)查詢,并解決了變量聲明和預(yù)處理語句的問題

Mysql Oracle中的Start with...Connect by

工作需要,遷移數(shù)據(jù)庫時(shí)發(fā)現(xiàn)使用了Oracle中的start with來進(jìn)行樹的遞歸查詢,所以自己動(dòng)手豐衣足食。

通過一番搜索后發(fā)現(xiàn)

大家的實(shí)現(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ù)失敗,或者各種錯(cuò)誤,所以我使用了存儲(chǔ)過程,效果一樣),所以我們使用set和execute來進(jìn)行語句的拼接和執(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í)行后,你會(huì)發(fā)現(xiàn),哦豁,它居然報(bào)了這樣一個(gè)錯(cuò):

1327 - Undeclared variable: sTempChd;

這個(gè)低級(jí)錯(cuò)誤困擾了我半天,我不是聲明了sTempChd為declare嗎?

答案很簡(jiǎn)單

預(yù)處理語句(也就是我們的prepare)中,只接受@聲明的參數(shù)。因?yàn)樵诖鎯?chǔ)過程中,使用動(dòng)態(tài)語句,預(yù)處理時(shí),動(dòng)態(tài)內(nèi)容必須賦給一個(gè)會(huì)話變量,也就是@形式聲明的變量,而declare聲明的是存儲(chǔ)過程變量,具體的內(nèi)容涉及到更深的知識(shí),我暫時(shí)無法找到原因。

前文是自上而下的查詢,自下而上的查詢其實(shí)很簡(jiǎn)單,只要替換一下參數(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ù)處理語句過多,達(dá)到max_prepared_stmt_count的上限值。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • RR與RC隔離級(jí)別下索引和鎖的測(cè)試腳本示例代碼

    RR與RC隔離級(jí)別下索引和鎖的測(cè)試腳本示例代碼

    這篇文章主要給大家介紹了關(guān)于RR與RC隔離級(jí)別下索引和鎖的測(cè)試腳本的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • mysql中GROUP_CONCAT函數(shù)使用技巧及問題詳解

    mysql中GROUP_CONCAT函數(shù)使用技巧及問題詳解

    這篇文章主要給大家介紹了關(guān)于mysql中GROUP_CONCAT函數(shù)使用技巧及問題的相關(guān)資料,GROUP_CONCAT是MySQL中的一個(gè)聚合函數(shù),它用于將多行數(shù)據(jù)按照指定的順序連接成一個(gè)字符串并返回結(jié)果,需要的朋友可以參考下
    2023-11-11
  • 將圖片儲(chǔ)存在MySQL數(shù)據(jù)庫中的幾種方法

    將圖片儲(chǔ)存在MySQL數(shù)據(jù)庫中的幾種方法

    今天小編就為大家分享一篇關(guān)于將圖片儲(chǔ)存在MySQL數(shù)據(jù)庫中的幾種方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Explain命令在優(yōu)化查詢中的實(shí)際應(yīng)用

    Explain命令在優(yōu)化查詢中的實(shí)際應(yīng)用

    在MySQL中,EXPLAIN命令是一種非常重要的查詢優(yōu)化工具,它可以幫助我們分析SQL查詢語句的執(zhí)行計(jì)劃,以及如何優(yōu)化它們。本文介紹了Explain命令在優(yōu)化查詢中的實(shí)際應(yīng)用,感興趣的小伙伴可以參考閱讀
    2023-04-04
  • Mysql利用group by分組排序

    Mysql利用group by分組排序

    這篇文章主要為大家詳細(xì)介紹了Mysql利用group by分組排序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • MySQL 客戶端不輸入用戶名和密碼直接連接數(shù)據(jù)庫的2個(gè)方法

    MySQL 客戶端不輸入用戶名和密碼直接連接數(shù)據(jù)庫的2個(gè)方法

    MySQL 客戶端不輸入用戶名和密碼直接連接數(shù)據(jù)庫的2個(gè)方法,大家可以測(cè)試下。
    2009-07-07
  • MySQL Group by的優(yōu)化詳解

    MySQL Group by的優(yōu)化詳解

    這篇文章主要介紹了MySQL Group by 優(yōu)化的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下
    2021-03-03
  • Mysql update多表聯(lián)合更新的方法小結(jié)

    Mysql update多表聯(lián)合更新的方法小結(jié)

    這篇文章主要介紹了Mysql update多表聯(lián)合更新的方法小結(jié),通過實(shí)例代碼給大家介紹了mysql多表關(guān)聯(lián)update的語句,感興趣的朋友跟隨小編一起看看吧
    2020-02-02
  • 虛擬機(jī)linux端mysql數(shù)據(jù)庫無法遠(yuǎn)程訪問的解決辦法

    虛擬機(jī)linux端mysql數(shù)據(jù)庫無法遠(yuǎn)程訪問的解決辦法

    最近在項(xiàng)目搭建過程中遇到一問題,有關(guān)虛擬機(jī)linux端mysql數(shù)據(jù)庫無法遠(yuǎn)程訪問,通過查閱相關(guān)數(shù)據(jù)庫資料問題解決,下面把具體的解決辦法分享給大家,有需要的朋友可以參考下
    2015-08-08
  • centos7安裝mysql5.7的踩坑記錄

    centos7安裝mysql5.7的踩坑記錄

    最近在做項(xiàng)目中發(fā)現(xiàn)CentOS 7下升級(jí)MySQL5.7的一個(gè)坑,所以下面這篇文章主要給大家介紹了關(guān)于centos7安裝mysql5.7的踩坑記錄,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05

最新評(píng)論

香河县| 威远县| 灌云县| 论坛| 陈巴尔虎旗| 密山市| 化德县| 黄平县| 万山特区| 栾城县| 海兴县| 晋宁县| 德保县| 武乡县| 五峰| 丹江口市| 台州市| 阿尔山市| 钟祥市| 苗栗市| 香格里拉县| 体育| 濮阳市| 长白| 栾川县| 鸡东县| 中江县| 巴林右旗| 万州区| 富裕县| 开平市| 淳化县| 奉新县| 昌吉市| 常山县| 茶陵县| 沙湾县| 盘山县| 金寨县| 泸州市| 靖州|