本帖最后由 wildwave 于 2010-01-17 21:19:49 编辑

解决方案 »

  1.   

    这个要求像是买面粉,要精面,入口即化的。你拿的还不是钱,是分...
    而且你还没给出测试数据的脚本,还要别人自己建表插入数据随手写的,相信我就试试,不相信可以无视
    select superid,supername,level from test_func
    start with code='xxxx'
    connect by prior superid=code这个表设计得不太合理,superName字段可以不要
      

  2.   

    爱慕所瑞。
    我言辞有些过激。
    我只是想说:术业有专攻,闻道有先后。
    其实,有些东西,都不是绝对。大家都是IT业人士,求生活而已。技术不能转化为效益,就是垃圾!所以,没有最懂,只有更懂。尊重大家,就是自己。但是,毕竟我的措辞,有失偏颇。向您道歉,鞠躬!
    本机既没有ORACLE,也没有PL/SQL,无法调试。
    若有幸,明天到单位,定不遗余力!再次表示遗憾,对事不对人~
      

  3.   


    SELECT LTRIM(SYS_CONNECT_BY_PATH(superid, ' ——》'), ' ——》'),
           LTRIM(SYS_CONNECT_BY_PATH(superid, ' ——》'), ' ——》'),
           level
      FROM test_func
     start with code = 'xxxx'
    connect by prior superid = code哈哈,也未调试,就一条语句而己,相信你看了就会明白
      

  4.   

    SQL> select * from test;
     
    CODE      CODENAME   SUPERID SUPERNAME
    --------- ---------- ------- ------------
    000       北京一小学 0       北京市教育局
    000001    一年级     000     北京一小学
    000001101 一年级一班 000001  一年级
    000001102 一年级二班 000001  一年级
    000001103 一年级三班 000001  一年级
    000002    二年级     000     北京一小学
    000001201 二年级一班 000002  二年级
    000001202 二年级二班 000002  二年级
    000001203 二年级三班 000002  二年级
    000003    三年级     000     北京一小学
    000001301 三年级一班 000003  三年级
    000001302 三年级二班 000003  三年级
    000001303 三年级三班 000003  三年级
     
    13 rows selected
    create or replace procedure test_func(t_code varchar2) is
    Cursor c is
    select distinct superid,supername,level from test
    connect by prior superid = code
    start with code = t_code; 
    begin
    for c1 in c loop
    dbms_output.put_line(c1.superid || ' ' || c1.supername || ' ' || c1.level);
    end loop;
    end ;
    SQL> set serveroutput on;
    SQL> exec test_func('000003');
     
    000 北京一小学 1
    0 北京市教育局 2
      

  5.   

    Select a.superId,a.superName where test_func a a.code not in(
    select b.code from test_func b connect by b.code = b.superId start with b.code = 输入的code
    )
      

  6.   

    SQL> CREATE OR REPLACE FUNCTION test_func
      2     (pi_code    IN      VARCHAR2)
      3  RETURN SYS_REFCURSOR
      4  IS
      5     po_result SYS_REFCURSOR;
      6  BEGIN
      7     OPEN po_result FOR
      8        SELECT superid,supername FROM test
      9        START WITh code=pi_code
     10        CONNECT BY PRIOR superid=code;
     11     RETURN po_result;
     12  END;
     13  /函数已创建。SQL> select test_func('000001303') from dual;TEST_FUNC('000001303
    --------------------
    CURSOR STATEMENT : 1CURSOR STATEMENT : 1SUPERID          SUPERNAME
    ---------------- --------------------------------
    000003           三年级
    000              北京一小学
    0                北京市教育局
    SQL>
      

  7.   

    我调试那函数
    CREATE OR REPLACE FUNCTION test_func 
          (pi_code    IN      VARCHAR2) 
       RETURN SYS_REFCURSOR 
       IS 
          po_result SYS_REFCURSOR; 
        BEGIN 
          OPEN po_result FOR 
              SELECT superid,supername FROM test 
              START WITh code=pi_code 
           CONNECT BY PRIOR superid=code; 
    11    RETURN po_result; 
    12  END; 
    结果没也来呢!请指教
    我编辑那函数后 用select test_func('000001101') from dual;后出现
    test_view('000001101')
    <Cursor>
      

  8.   

    我调试那函数 
    CREATE OR REPLACE FUNCTION test_func 
          (pi_code    IN      VARCHAR2) 
      RETURN SYS_REFCURSOR 
      IS 
          po_result SYS_REFCURSOR; 
        BEGIN 
          OPEN po_result FOR 
              SELECT superid,supername FROM test 
              START WITh code=pi_code 
          CONNECT BY PRIOR superid=code; 
       RETURN po_result; 
      END; 
    结果没也来呢!请指教 
    我编辑那函数后 用select test_func('000001101') from dual;后出现 
    test_func('000001101') 
    <Cursor>
      

  9.   

    pl/sql啊,感觉仁兄技术蛮强的!羡慕你
      

  10.   

    pl/sql中点击调试窗结果集中游标右边的小按钮,PL/SQL将在新窗口中显示游标结果集。记住:必须先运行,再显示。且一次运行,只能显示一次。再显示需要再次运行。谢谢!其实我也是菜鸟,只是痴长几岁,多吃几年干饭而已。
      

  11.   

    谦虚了,仰慕你,真的。
    我编辑那函数后 用select test_func('000001101') from dual;后出现 
    test_func('000001101') 
    <Cursor>
    我单步调试也会啊,可结果就是:test_func('000001101') 
                              <Cursor>
    你也是用pl/sql吗?
      

  12.   

    看见<Cursor>右边的...按钮吗?
    直接点它。
    自然有你想要的结果。要不你和我上面一样,在命令行了执行。
      

  13.   

    我汗,本机一删,CSDN也无法显示了。没存服务器上……这是游戏规则,呵呵。PL/SQL就是这样。
      

  14.   

    CREATE OR REPLACE FUNCTION test_func 
          (pi_code    IN      VARCHAR2) 
          RETURN SYS_REFCURSOR 
          IS 
           po_result SYS_REFCURSOR; 
         BEGIN 
          OPEN po_result FOR 
             SELECT superid,supername FROM test 
             START WITh code=pi_code 
           CONNECT BY PRIOR superid=code; 
        RETURN po_result; 
      END; 
    兄弟的代码我有些地方不懂,这里start with code=pi_code 
    connect by prior superid=code
    分别是什么意思啊?能否指点下,听听你的思路!谢谢。
      

  15.   

    这个是ORACLE树型结构数据查询。
    start with 指起点
    connect by是连接条件。
    prior是指父子关系父的一方。具体语法,你可以参见网上的资料,比我表达的清晰多了,呵呵。
      

  16.   

    sys_refcursor是不是一种游标类型啊?没见过呢
      

  17.   

    好的,谢谢了!我现在在公司就是写oracle函数和存储过程,以后多指点哈
      

  18.   

    suiziguo兄弟,今天教教我洛,我在上面又提了一个求两个函数源码的问题,插入和删除的,谢谢你了