資料庫connectby
⑴ mysql 有沒有類似 orcale connect by d
mysql資料庫實現類似oracle connect by prior的查詢
--注下面的語句用到了表
DROP TABLE IF EXISTS `a_sys_org`;
CREATE TABLE `a_sys_org` (
`org_id` varchar(32) NOT NULL COMMENT '機構號',
`org_name` varchar(256) NOT NULL COMMENT '機構名稱',
`parent_org_id` varchar(32) NOT NULL COMMENT '父機構號',
PRIMARY KEY (`org_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系統機構表';
-- 方法1,函數實現
-- 注意 SELECT getChildOrg('00010');
-- 最大支持字元串連接102400
DROP FUNCTION IF EXISTS getChildidList;
CREATE FUNCTION getChildidList(rootId VARCHAR(32))
RETURNS text
BEGIN
DECLARE sTemp text;
DECLARE sTempChd text;
SET@@group_concat_max_len = 102400;
SET sTemp = '$';
SET sTempChd = rootId;
WHILE sTempChd IS NOT NULL DO
SET sTemp = concat(sTemp, ',', sTempChd);
SELECT
group_concat(org_id) INTO sTempChd
FROM
a_sys_org
WHERE
FIND_IN_SET(parent_org_id, sTempChd) > 0;
END WHILE;
SET@@group_concat_max_len = 1024;
RETURN SUBSTRING(sTemp,3);
END
-- 方法2,存儲過程+中間表
-- 存儲過程實現mysql遞歸查詢,類似oracle start with connect by prior
-- 注意 call getChildOrg('00010');
-- 遞歸有深度限制,最大是255層
DROP PROCEDURE IF EXISTS getChildOrg;
CREATE PROCEDURE getChildOrg (IN rootid VARCHAR(32))
BEGIN
DECLARE _level_var INT;
DROP TABLE IF EXISTS temp_child_list;
CREATE TABLE temp_child_list (
_id VARCHAR(32),
_level INT
);
SET _level_var = 0;
INSERT INTO temp_child_list (_id, _level) VALUE(rootid,_level_var);
SET _level_var = _level_var + 1;
INSERT INTO temp_child_list (_id, _level)
SELECT
org_id,
_level_var
FROM
a_sys_org
WHERE
parent_org_id = rootid;
WHILE ROW_COUNT() > 0
DO
SET _level_var = _level_var + 1;
INSERT INTO temp_child_list SELECT
a.org_id,
_level_var
FROM
a_sys_org a,
temp_child_list b
WHERE
a.parent_org_id = b._id
AND b._level = _level_var - 1;
END WHILE;
SELECT _id FROM temp_child_list ORDER BY _level;
DROP TABLE IF EXISTS temp_child_list;
END;
-- 方法3,存儲過程+臨時表
-- 存儲過程實現mysql遞歸查詢,類似oracle start with connect by prior
-- 注意 call getChildOrg('00010');
-- 遞歸有深度限制,最大是255層
-- 此存儲過程利用了臨時表
DROP PROCEDURE IF EXISTS showChildList;
CREATE PROCEDURE showChildList (IN rootId VARCHAR(32))
BEGIN
SET@@max_sp_recursion_depth=99;
DROP TEMPORARY TABLE IF EXISTS temp_child_list;
CREATE TEMPORARY TABLE temp_child_list ( sno INT PRIMARY KEY auto_increment, _id VARCHAR (32), _depth INT );
-- 插入當前節點
INSERT INTO temp_child_list (_id, _depth) VALUES (rootId ,- 1);
-- 插入子節點
CALL createChildList (rootId, 0);
SELECT o.org_id FROM temp_child_list t, a_sys_org o WHERE t._id = o.org_id ORDER BY t.sno;
END;
DROP PROCEDURE IF EXISTS createChildList;
CREATE PROCEDURE createChildList ( IN rootId VARCHAR (32), IN depth_var INT )
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE b VARCHAR (32);
DECLARE cur1 CURSOR FOR SELECT org_id FROM a_sys_org WHERE parent_org_id = rootId;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
INSERT INTO temp_child_list (_id, _depth) SELECT org_id, depth_var FROM a_sys_org WHERE parent_org_id = rootId;
OPEN cur1;
FETCH cur1 INTO b;
WHILE done = 0 DO CALL createChildList (b, depth_var + 1);
FETCH cur1 INTO b;
END WHILE;
CLOSE cur1;
END;
⑵ Java代碼,connect.commit 執行到這一句就將資料庫的createby這個值覆蓋,
首先資料庫引擎需要支持事務。
其次,在開啟事務後,所有增刪改都是在緩存中操作的。
最後,當事務提交後,才寫入資料庫。
⑶ JDBC連接mysql資料庫出現java.lang.NullPointerException
Class.forName("com.mysql.jdbc.Driver").newInstance();
⑷ sql server怎麼實現oracle的connect by
sql server中實現oracle的connect by使用tree實現:
sql寫法如下:
WITHtree(empid,name,level)AS(
SELECTempid,name,1aslevel
FROMemp
WHEREname='Joan'
UNIONALL
SELECTchild.empid,child.name,parent.level+1
FROMempaschild
JOINtreeparentonparent.empid=child.mgrid
)
SELECTname
FROMtree;
⑸ ORACLE資料庫中有一個SQL報錯ORA-00600,其中使用了SYS_CONNECT_BY_PATH對一些數據進行匯總,求高手相助
Bug 4401437 CONNECT BY query may fail with OERI:qergiStart1 / OERI:qesmmCValStat4
This note gives a brief overview of bug 4401437.
The content was last updated on: 03-APR-2009
Click here for details of each of the sections below.
Affects:
Proct (Component) Oracle Server (Rdbms)
Range of versions believed to be affected Versions BELOW 11.1
Versions confirmed as being affected
10.2.0.1
10.1.0.4
9.2.0.8
Platforms affected Generic (all / most platforms affected)
Workaround
Add a "no_filtering" hint to the query.
可以通過加no_filtering的 提示了 繞過該錯誤哦!
如果自己搞不定可以找詩檀軟體專業ORACLE資料庫修復團隊成員幫您恢復!
詩檀軟體專業資料庫修復團隊
⑹ 兩個資料庫之間如何進行連接
用db_links可以解決此類問題:
drop database link ss
create database link woody_DB_LINK
connect to woodydb(資料庫實例名稱)
identified by woody123(密碼)
using 'woody.woodycad.com'(連接字元)
然後在oracle安裝目錄下:D:\oracle\network\ADMIN
tnsnames.ora文件裡面根據鏈接情況加上鏈接
woody.woodyCAD.COM =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.100.24)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = woody.com)
)
)
⑺ connect by oracle 什麼意思
Oracle是世界領先的信息管理軟體開發商,因其復雜的關系資料庫產品而聞名.
⑻ ORACLE 偽列(level)、rpad/lpad、connectby、父節點子節點問題送分系列(一)
LZ你好
這個rpad是右邊填充的意思,但是填充的是
但這個RPAD( ' ', 2*(LEVEL-1), '-' )意思是在空格右側填充2*(LEVEL-1)個長度的橫杠,這個你理解的好像沒問題
level開始是從start with開始算起的,你這里就是START WITH UPPERDEPID IS NULL,因為根據父ID,你這個為空的就是最頂層,這個你也可以改成
START WITH UPPERDEPID =0 看下效果
樹形結構的意思,我簡單給你說一下
家裡有爺爺,爺爺有兩個兒子,每個兒子又有兩個兒子
那麼畫圖出來就是這樣
CONNECT_BY_ROOT 從你start with的開始算起,最頂端結點就是總經辦,這個你看下查詢結果就能看出來
CONNECT_BY_ISLEAF 如果下邊還有子節點,就為0,無子節點了就是1,按照我給你發的圖,也就是四個孫子下邊都沒節點了,他們最後都顯示1,上邊爺爺和兒子都顯示0
level,就是爺爺是最頂端,為1,依次類推
給你舉例子的圖畫的難看了點哈,見笑了
暈,你補充了好多啊,你先看吧,哪不懂你再問,我再給你解釋
⑼ Oracle資料庫,怎樣使用connect by實現樹形結構中數值的累加
如果是數據累加的話,可以通過sum函數來實現,如果是計數的話,可以通過count來實現。
sql:select username ,count(accountNo) as count,sum(amount) as amount
from tablename order by username desc group by username;
以上就可以求出username下,accountNo的條數和對應的總amount,之後通過username欄位降序排序。