是不是要考察队oracle的对象编程啊,可以建立一个record,然后再建立一个存储这个record对象的表

解决方案 »

  1.   

    create or replace procedure p_recursion(p_start varchar2,p_level number default 0)
    as
    begin
    dbms_output.put_line(lpad(' ',p_level*2,' ')||p_start);
    for c in (select * from aa a where exists(select 1 from aa b where b.fid=p_start and b.id=a.id) order by id) loop
    p_recursion(c.id,p_level+1);
    end loop;
    end;
    /SQL> select * from aa;ID FID
    -- ---
    1  0
    2  1
    3  1
    4  2
    5  3
    6  4
    6  57 rows selectedSQL> exec p_recursion('1');
    1
      2
        4
          6
          6
      3
        5
          6
          6测试还有少少出了错,最后一行多了一个6
      

  2.   

    create or replace procedure p_recursion(p_start varchar2,p_level number default 0)
    as
    begin
    dbms_output.put_line(lpad(' ',p_level*2,' ')||p_start);
    for c in (select * from aa a where exists(select 1 from aa b where b.fid=p_start and b.fid=a.fid) order by id) loop
    p_recursion(c.id,p_level+1);
    end loop;
    end;
    /
    SQL> exec p_recursion('1');
    1
      2
        4
          6
      3
        5
          6测试通过
      

  3.   

    在SQL SERVER中递归只能有36层递归。
    所以我们都不用递归来解决类士问题,不知道ORACLE是否有这种限制?
      

  4.   

    beckhambobo(beckham)兄,你用了游标呀
    题目要求不用游标呀
      

  5.   

    我的答案:
    CREATE OR REPLACE PROCEDURE GetSubEmp2(IN_X VARCHAR2)
    IS
    V_SQL VARCHAR2(200);
    V_COUNT NUMBER;
    V_STR VARCHAR2(200);
    V_INSTR VARCHAR2(200);
    BEGIN
        V_SQL:='SELECT COUNT(*) TCOUNT  FROM EMP WHERE MGR IN ('|| IN_X ||')';
    EXECUTE  immediate V_SQL INTO V_COUNT; 
    --IN_X:='';
    V_INSTR:='';
    WHILE V_COUNT>0 LOOP 
           V_SQL:='SELECT EMPNO   FROM EMP WHERE MGR IN ('||IN_X||
       ') AND  ROWNUM<'||TO_CHAR(V_COUNT+1)
       ||' MINUS SELECT  EMPNO   FROM EMP WHERE MGR IN ('||IN_X||') AND ROWNUM <'||TO_CHAR(V_COUNT);
       EXECUTE  immediate V_SQL INTO V_STR;
       IF V_INSTR ='' OR V_INSTR IS NULL THEN
          V_INSTR:=V_STR ;
       ELSE V_INSTR:=V_INSTR  || ','  || V_STR ;
       END IF;
       V_COUNT:=V_COUNT-1;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE(V_INSTR);
    IF  V_INSTR IS NOT NULL THEN
      GetSubEmp2(V_INSTR);   
    END IF;  
    END GetSubEmp2;
    /
      

  6.   

    beckhambobo(beckham)兄,不好意思,我看错了,你没用游标:)