用SQL读oracle的问题,求解
private void del(Connection conn, int id)
{
Statement stmt = null;
ResultSet rs = null;
try
{
stmt = conn.createStatement();
String sql = "select * from \ "bbs\ ".\ "article\ " where pid = " + id;
rs = stmt.executeQuery(sql);
while(rs.next())
{
int sid = rs.getInt( "id ");
System.out.println( "找到其子结点 " + sid);
del(conn, sid);
}
stmt.executeUpdate( "delete from \ "bbs\ ".\ "article\ " where id = " + id);
System.out.println( "删除此结点 " + id);
Statement disIdSt = conn.createStatement();
ResultSet disIdRs = disIdSt.executeQuery
( "select id from \ "bbs\ ".\ "article\ " where id > " + id );
while(disIdRs.next())
{
int disId = disIdRs.getInt(1);
System.out.println( "找到需要更改的结点 " + disId);
disIdSt.executeUpdate
( "update \ "bbs\ ".\ "article\ " set id = " + (disId - 1)
+ "where id = " + disId );
System.out.println( "修改id " + disId + "为 " + (disId - 1));
disIdSt.executeUpdate
( "update \ "bbs\ ".\ "article\ " set pid = " + (disId - 1)
+ "where pid = " + disId );
System.out.println( "修改pid " + disId + "为 " + (disId - 1));
}
disIdSt.close();
disIdRs.close();
这是del方法的一部分,删除一个树形结构的结点
测试树形结构如下:
id(结点号) pid(根结点号) 结构图
11 10 11
12 11 ---- 12
13 12 ---- 13
14 13 ---- 14
15 11 ---- 15
16 15 ---- 16
17 11 ---- 17
我测试将结点12删除,本预计应是12,13,14一并删除
并将15,16,17的ID号改为12,13,14
但测试结果输出如下:
此结点为12
确定树结点为11
找到其子结点13
找到其子结点14
删除此结点14
找到需要更改的结点15
修改id 15为14
修改pid 15为14
删除此结点13
找到需要更改的结点14
修改id 14为13
修改pid 14为13
删除此结点12
找到需要更改的结点13
修改id 13为12
修改pid 13为12
结点11仍然有子结点点
执行后树形结构如下:
id(结点号) pid(根结点号) 结构图
11 10 11
12 11 ---- 15
16 12 ---- 16
17 11 ---- 17
也就是说,改结点时 select id .... where id > id传回的结果集
ResultSet 在while中只调用了一次。。。
好困惑 我在SQLPLUS中 执行该语句确实返回的是3个值啊 15,16,和17
然而实际只改了15。。。
求高手解答
[解决办法]
oracle sql 有树遍历
delete from bbs where rowid in (
select rowid from bbs
start with id=11
connect by prior pid=id
)
start with id=11 开始遍历的起点
connect by prior pid=id 遍历的方向 如果 id=pid则方向反一下
这里pid=id 还是 id=pid 楼主自己试一下,好久没玩ORACLE 了
[解决办法]
哈,做项目也碰上了个树的问题。遍历树还可以用 order by nodeId ,nodePid。