以下是一个函数想实际该功能:
 (codes varchar2) return varchar2
as
      namecns varchar2(500);
      strSql varchar2(500);
begin
      strSql := 'select name_cn from yf_project_phase where (instr('''||codes||''',code)>0)';
      EXECUTE IMMEDIATE strSql into namecns; 
      return namecns; 
end;但该函数只能取一条记录的数据,不能取到多个记录的数据,想请各位帮忙改一下,以实现我想要的功能,谢谢了!

解决方案 »

  1.   

    楼主对INSTR函数理解是否有些偏差 instr(expr1, expr2)返回expr2在expr1中出现的位置, 楼主意思是当给定某个输入参数codes时, 判断它是否存在于字段code中吧?! 如果那样的话, 应没有必要用动态SQL. 
    instr(code, codes) > 0 或者 code like '%'||codes||'%'都可以完成任务了。例:(v_code varchar2) return varchar2 is 
       namecns varchar2(500);
    begin 
       for x in (select name_cn from yf_project_phase where instr(code, v_code)> 0) loop
           namecns := namecns || x.name_cn ||',';
       end loop;
       namecns := rtrim(namecns, ',');    -- 去掉最后一个逗号.
       return   namecns;   
    end; 
      

  2.   

    这个可以用oracle的数组来完成的。
    type r_name is record(name  emp.ename%type);
    type t_name is table of r_name%rowtype;function f_name (dept_id dept.deptno%type) return t_name
    as
        rt_name t_name;
    begin
       s_sql := 'select emp.ename bulk collect into rt_name from emp, dept where emp.deptno=dept_id';
       EXECUTE IMMEDIATE s_sql;
      return rt_name;
    end;declare
    rt_name t_name;
    begin
    rt_name := f_name(10);
    for i in 1 .. rt_name.count loop
    dbms_output.putline(rt_name(i).name);
    end;
      

  3.   

    chliang315 兄:     你的SQL测试过吗? 
    其实这个问题的关键就是使用一个循环, 但是要注意的是, 你返回多个记录时, 应该是用连接字符串将所有数据一起输出, 切变量要足够大, 因为函数只返回一个变量.
      

  4.   

    不好意思,没有测试。下面的测试了。嘿嘿
    declare
    type   r_name   is   record(name     emp.ename%type, deptno dept.deptno%type);
    type   t_name   is   table   of   r_name INDEX BY BINARY_INTEGER;
    rt_name t_name;
    begin
         rt_name(1).name := 'ddddd';
     rt_name(1).deptno:=1;
    rt_name(2).name :='ffff';
    rt_name(2).deptno:=2;
    rt_name(3).name :='eeee';
    rt_name(3).deptno:=3;
         for   i   in    1  ..   rt_name.count 
        loop
        dbms_output.put_line(rt_name(i).name);
     end loop;
    end;