错了。输出结果应该是nid     strname     strtransfertation      lon          
-----------------------------------------------------------------------
1       海淀区      海淀区 上地 菊园       100
2       上地        海淀区 上地 菊园       100
3       菊园        海淀区 上地 菊园       100  
-----------------------------------------------------------------------

解决方案 »

  1.   

    需要先写一个函数。
    参考:
    SQL  >  select  job,ename  from  emp;  
     
    JOB              ENAME  
    ---------  ----------  
    CLERK          SMITH  
    SALESMAN    ALLEN  
    SALESMAN    WARD  
    MANAGER      JONES  
    SALESMAN    MARTIN  
    MANAGER      BLAKE  
    MANAGER      CLARK  
    ANALYST      SCOTT  
    PRESIDENT  KING  
    SALESMAN    TURNER  
    CLERK          ADAMS  
     
    JOB              ENAME  
    ---------  ----------  
    CLERK          JAMES  
    ANALYST      FORD  
    CLERK          MILLER  
     
    已选择14行。  
     
    SQL  >  create  or  replace  function  f_ename(jobno  in  varchar2)  
       2    return  varchar2  is  
       3      
       4    str_return  varchar2(200);  
       5    cursor  c_ename(v_jobno  varchar2)  is  select  ename  from  emp  where  job=v_jobno;  
       6    begin  
       7    for  str_temp  in  c_ename(jobno)  loop  
       8    str_return:=str_return  |  |str_temp.ename;  
       9    end  loop;  
     10    return  str_return;  
     11    end;  
     12    /  
     
    函数已创建。  
     
    SQL  >  select  f_ename(job)  from  (  
       2    select  distinct  job  from  emp);  
     
    F_ENAME(JOB)  
    ---------------------------------------  
     SCOTT  FORD  
     SMITH  ADAMS  JAMES  MILLER  
     JONES  BLAKE  CLARK  
     KING  
     ALLEN  WARD  MARTIN  TURNER  
     
    SQL  >  
    加上job列:  
    SQL  >  select  job,f_ename(job)  from  (  
       2    select  distinct  job  from  emp);  
     
    JOB            F_ENAME(JOB)  
    -------------------------------------------------------  
    ANALYST  SCOTT  FORD  
    CLERK  SMITH  ADAMS  JAMES  MILLER  
    MANAGER  JONES  BLAKE  CLARK  
    PRESIDENT  KING  
    SALESMAN  ALLEN  WARD  MARTIN  TURNER
      

  2.   

    好复杂。有没有用sql语句就能搞定的? oracle我不熟。函数更不会创建了。
      

  3.   

    bzszp(SongZip) 老大已经给了你函数了, 你直接调用一下就可以了. 仿照着写.
      

  4.   

    12:54:33 SQL> create  or  replace  function  f_con_str(v_lon  in  number)  
    12:54:45   2  return  varchar2  is     
    12:54:45   3  str_return  varchar2(200);  
    12:54:46   4  cursor  c_str(v_l number)  is  select strname from poibaseinfo where lon=v_
    12:54:46   5  begin  
    12:54:46   6  for  str_temp  in  c_str(v_lon)  loop  
    12:54:46   7  str_return:=str_return||' '||str_temp.strname;  
    12:54:46   8  end  loop;  
    12:54:46   9  return  str_return;  
    12:54:46  10  end f_con_str;  
    12:54:46  11  /函数已创建。已用时间:  00: 00: 00.47
    12:54:46 SQL> select f_con_str(lon) from poibaseinfo;F_CON_STR(LON)
    --------------------------------------------------------------------------------
     海淀区 上地 菊园
     海淀区 上地 菊园
     海淀区 上地 菊园
     复兴门 天安门
     复兴门 天安门已用时间:  00: 00: 00.31
    12:54:49 SQL> select * from poibaseinfo;       NID STRNAME    STRTRANSFERTATION                     LON
    ---------- ---------- ------------------------------ ----------
             1 海淀区                                           100
             2 上地                                             100
             3 菊园                                             100
             4 复兴门                                           200
             5 天安门                                           200已用时间:  00: 00: 00.31
      

  5.   

    但是直接update 有问题,更新的时候同时从该表查询数据,有问题可以使用另外一张表暂存数据12:59:36 SQL> create table t_temp as select distinct lon,f_con_str(lon) STRTRANSFERTATION from poiba
    seinfo;表已创建。已用时间:  00: 00: 00.12
    12:59:53 SQL> select * from t_temp;       LON
    ----------
    STRTRANSFERTATION
    --------------------------------------------------------------------------------
           100
     海淀区 上地 菊园       200
     复兴门 天安门
    已用时间:  00: 00: 00.46
    13:00:00 SQL> update poibaseinfo set STRTRANSFERTATION=(select STRTRANSFERTATION
    13:00:22   2  from t_temp where t_temp.lon=poibaseinfo.lon);已更新5行。已用时间:  00: 00: 00.15
    13:00:38 SQL> select * from poibaseinfo;       NID STRNAME    STRTRANSFERTATION                     LON
    ---------- ---------- ------------------------------ ----------
             1 海淀区      海淀区 上地 菊园                     100
             2 上地        海淀区 上地 菊园                     100
             3 菊园        海淀区 上地 菊园                     100
             4 复兴门      复兴门 天安门                        200
             5 天安门      复兴门 天安门                        200已用时间:  00: 00: 00.16
      

  6.   

    你这个要写函数了
    而且你的结果也有问题
    凭什么“海淀区”的strtransfertation是“海淀区 上地 菊园”
    而“上地”和“菊园”的strtransfertation都没有包括自身内容,
      

  7.   

    照这个测试一下,如果编译通过了,就直接调用一定成,我刚做了一个差不多的create  or  replace  function  f_con_str(v_lon  in  number)  
    return  varchar2  is     
    v_all_strname varchar2(500):='';
    ig1 number;
    ig2 number;cursor c_tab_name is select distinct strname from poibaseinfo where lon:=v_lon;
    type dept_array is varray(100) of poibaseinfo.strname%type;
    depts dept_array;begin
         ig1:=0;
         depts:=dept_array();
         for tab_name in c_tab_name loop
         ig1:=ig1+1;
         depts.extend();
         depts(ig1):=tab_name.strname;
         end loop;
         
         for ig2 in 1..ig1 loop
         v_all_strname:=v_all_strname+depts(ig2);
    /*  dbms_output.put_line(v_all_strname); */ ----测一下这儿
         execute immediate 'update poibaseinfo set strtransfertation='||v_all_strname||'where lon='||v_lon;
         commit;
         end loop;
    end;
    /