可以用level   start with ....connect by
来写.
SQL> select * from tree;NODE                 PNODE
-------------------- --------------------
node1                node2
node2                node3
node3                node4
node4                rootSQL> 
SQL> SELECT *
  2    FROM (SELECT P.*, ROW_NUMBER() OVER(ORDER BY P.LL DESC) RK
  3            FROM (SELECT LEVEL AS LL, TREE.*
  4                    FROM TREE
  5                   START WITH NODE = 'node2'
  6                  CONNECT BY NODE = PRIOR PNODE) P)
  7   WHERE RK = 1
  8  /        LL NODE                 PNODE                        RK
---------- -------------------- -------------------- ----------
         3 node4                root                          1SQL>

解决方案 »

  1.   

    CREATE OR REPLACE FUNCTION getfullpath(node varchar2) 
    RETURN VARCHAR2 
    IS 
    path VARCHAR2(4000); 
    BEGIN
    path := '/' || node;
    FOR cur IN (SELECT  pnode from (select pnode from struct start with node = 'node2' connect by prior pnode=node)) LOOP  
    path := '/' || cur.pnode || path; 
    END LOOP; 
    RETURN path; 
    END;
    /SQL> select * from struct;NODE       PNODE
    ---------- ----------
    node1      node2
    node2      node3
    node3      node4
    node4      root
    SQL> select getfullpath('node1') from dual;GETFULLPATH('NODE1')
    ------------------------------------------------/root/node4/node3/node2/node1SQL> select getfullpath('node2') from dual;GETFULLPATH('NODE2')
    ------------------------------------------------/root/node4/node3/node2SQL> select getfullpath('node3') from dual;GETFULLPATH('NODE3')
    ------------------------------------------------/root/node4/node3
      

  2.   

    CREATE OR REPLACE FUNCTION getfullpath(in_node varchar2)
    RETURN VARCHAR2
    IS
    path VARCHAR2(4000);
    BEGIN
    path := '/' || in_node;
    FOR cur IN (SELECT  pnode from (select pnode from struct start with node = in_node connectby prior pnode=node)) LOOP
    path := '/' || cur.pnode || path;
    END LOOP;
    RETURN path;
    END;
    /