1.表結構
CREATE TABLE folder(
id BIGINT(20) NOT NULL,
parent_id BIGINT(20) DEFAULT NULL,
PRIMARY KEY id
);
2.根據傳入id查詢所有子節點及其的id
創建函數:
CREATE FUNCTION `getParList`(rootId BIGINT)
RETURNS varchar(1000)
BEGIN
DECLARE sTemp VARCHAR(1000);
DECLARE sTempPar VARCHAR(1000);
SET sTemp = '';
SET sTempPar =rootId;
#循環遞歸
WHILE sTempPar is not null DO
#判斷是否是第一個,不加的話第一個會為空
IF sTemp != '' THEN
SET sTemp = concat(sTemp,',',sTempPar);
ELSE
SET sTemp = sTempPar;
END IF;
SET sTemp = concat(sTemp,',',sTempPar);
SELECT group_concat(parent_id) INTO sTempPar FROM folder where parent_id<>id and FIND_IN_SET(id,sTempPar)>0;
END WHILE;
RETURN sTemp;
END
調用:
select id
from folder
where FIND_IN_SET(id,getChildList(2))
3.根據傳入id查詢所有父節點及其的id
創建函數:
CREATE FUNCTION `getChildList`(rootId BIGINT)
RETURNS varchar(1000)
BEGIN
DECLARE sTemp VARCHAR(1000);
DECLARE sTempChd VARCHAR(1000);
SET sTemp = '$';
SET sTempChd =cast(rootId as CHAR);
WHILE sTempChd is not null DO
SET sTemp = concat(sTemp,',',sTempChd);
SELECT group_concat(id) INTO sTempChd FROM folder where FIND_IN_SET(parent_id,sTempChd)>0;
END WHILE;
RETURN sTemp;
END
調用:
select id from folder where FIND_IN_SET(id,getParList(10))
This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de 錯誤解決辦法
這是我們開啟了bin-log, 我們就必須指定我們的函數是否是
1 DETERMINISTIC 不確定的
2 NO SQL 沒有SQl語句,當然也不會修改數據
3 READS SQL DATA 只是讀取數據,當然也不會修改數據
4 MODIFIES SQL DATA 要修改數據
5 CONTAINS SQL 包含了SQL語句
其中在function里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我們開啟了 bin-log, 我們就必須為我們的function指定一個參數。
在MySQL中創建函數時出現這種錯誤的解決方法:
set global log_bin_trust_function_creators=TRUE;
