首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

用SQL读oracle的有关问题,求解

2012-02-10 
用SQL读oracle的问题,求解privatevoiddel(Connectionconn,intid){StatementstmtnullResultSetrsnulltr

用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。

热点排行