亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

Mysql Oracle中的Start with...Connect by

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

通過(guò)一番搜索后發(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;

但是這樣的代碼沒(méi)法復(fù)用(而且我的navicat居然建立函數(shù)失敗,或者各種錯(cuò)誤,所以我使用了存儲(chǔ)過(guò)程,效果一樣),所以我們使用set和execute來(lái)進(jìn)行語(yǔ)句的拼接和執(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;

這樣一來(lái)我們就可以將表名作為參數(shù)傳入,但是一番執(zhí)行后,你會(huì)發(fā)現(xiàn),哦豁,它居然報(bào)了這樣一個(gè)錯(cuò):

1327 - Undeclared variable: sTempChd;

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

答案很簡(jiǎn)單

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

前文是自上而下的查詢(xún),自下而上的查詢(xún)其實(shí)很簡(jiǎn)單,只要替換一下參數(shù)和語(yǔ)句內(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ǔ)句,釋放預(yù)處理sql,免得session的預(yù)處理語(yǔ)句過(guò)多,達(dá)到max_prepared_stmt_count的上限值。

總結(jié)

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

相關(guān)文章

  • MySQL Router實(shí)現(xiàn)MySQL的讀寫(xiě)分離的方法

    MySQL Router實(shí)現(xiàn)MySQL的讀寫(xiě)分離的方法

    MySQL Router是MySQL官方提供的一個(gè)輕量級(jí)MySQL中間件,用于取代以前老版本的SQL proxy。本文主要介紹了MySQL Router實(shí)現(xiàn)MySQL的讀寫(xiě)分離的方法,感興趣的可以了解一下
    2021-05-05
  • MySQL?到Oracle?實(shí)時(shí)數(shù)據(jù)同步

    MySQL?到Oracle?實(shí)時(shí)數(shù)據(jù)同步

    這篇文章主要介紹了MySQL?到Oracle?實(shí)時(shí)數(shù)據(jù)同步,本次?MySQL?數(shù)據(jù)實(shí)時(shí)同步到?Oracle大概只花了幾分鐘就完成。使用的工具是Tapdata?Cloud?,這個(gè)工具是永久免費(fèi)的,需要的朋友可以參考一下
    2022-01-01
  • 在 Windows 10 上安裝 解壓縮版 MySql(推薦)

    在 Windows 10 上安裝 解壓縮版 MySql(推薦)

    這篇文章主要介紹了在 Windows 10 上安裝 解壓縮版 MySql(推薦)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-12-12
  • mysql 字符串轉(zhuǎn)數(shù)組的實(shí)現(xiàn)示例

    mysql 字符串轉(zhuǎn)數(shù)組的實(shí)現(xiàn)示例

    有時(shí)候,我們需要將一個(gè)字符串拆分成一個(gè)數(shù)組,本文主要介紹了mysql 字符串轉(zhuǎn)數(shù)組的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • 分析一條sql的性能的標(biāo)準(zhǔn)總結(jié)

    分析一條sql的性能的標(biāo)準(zhǔn)總結(jié)

    在本篇文章里小編給各位分享了關(guān)于分析一條sql的性能的相關(guān)知識(shí)點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們學(xué)習(xí)下。
    2019-07-07
  • Mysql中被鎖住的表查詢(xún)以及如何解鎖詳解

    Mysql中被鎖住的表查詢(xún)以及如何解鎖詳解

    這篇文章主要介紹了Mysql中被鎖住的表查詢(xún)以及如何解鎖的相關(guān)資料,這些方法可以幫助你釋放鎖并恢復(fù)表的正常使用,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • Linux如何添加mysql系統(tǒng)環(huán)境變量

    Linux如何添加mysql系統(tǒng)環(huán)境變量

    這篇文章主要介紹了Linux如何添加mysql系統(tǒng)環(huán)境變量問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • MySQL?中的?SQL_MODE?設(shè)置方法ANSI_QUOTES?選項(xiàng)解析與應(yīng)用小結(jié)

    MySQL?中的?SQL_MODE?設(shè)置方法ANSI_QUOTES?選項(xiàng)解析與應(yīng)用小結(jié)

    sql_mode是?MySQL?中的一個(gè)系統(tǒng)變量,用于控制?SQL?語(yǔ)句的解析和執(zhí)行方式,它由多個(gè)選項(xiàng)組成,每個(gè)選項(xiàng)都可以獨(dú)立設(shè)置,以滿(mǎn)足不同的應(yīng)用場(chǎng)景需求,這篇文章主要介紹了MySQL?中的?SQL_MODE?設(shè)置:ANSI_QUOTES?選項(xiàng)解析與應(yīng)用
    2024-12-12
  • MySQL如何更改數(shù)據(jù)庫(kù)數(shù)據(jù)存儲(chǔ)目錄詳解

    MySQL如何更改數(shù)據(jù)庫(kù)數(shù)據(jù)存儲(chǔ)目錄詳解

    這篇文章主要給大家介紹了關(guān)于MySQL如何更改數(shù)據(jù)庫(kù)數(shù)據(jù)存儲(chǔ)目錄的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • MySQL定位長(zhǎng)事務(wù)(Identify Long Transactions)的實(shí)現(xiàn)

    MySQL定位長(zhǎng)事務(wù)(Identify Long Transactions)的實(shí)現(xiàn)

    在MySQL的運(yùn)行中,經(jīng)常會(huì)遇到一些長(zhǎng)事務(wù),本文主要介紹了MySQL定位長(zhǎng)事務(wù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09

最新評(píng)論