一张表  t_codename   有2个字段  name 、id
传入一个字符串    "1,2,3,4,5,6,7,8"(是这张表的id,现在是一个字符串),  如何写function 方法 让这个字符串中的  id 对应输出这张表中的 name; 返回"name,name,name,name,name,name,name,name"
create or replace function idToname(thisid varchar2) return varchar2 is thisname varchar2(200);
begin
select t.name into thisname  from t_codename t where id = '1';
return thisname;
end  idToname;
我只会写这样基础的  求教

解决方案 »

  1.   

    实测数据:CREATE TABLE T97
    (
        ID NUMBER(4),
        MyName VARCHAR2(20)
    );
    INSERT INTO T97 VALUES(1, 'A');
    INSERT INTO T97 VALUES(2, 'B');
    INSERT INTO T97 VALUES(3, 'C');
    INSERT INTO T97 VALUES(4, 'D');
    INSERT INTO T97 VALUES(5, 'E');
    INSERT INTO T97 VALUES(6, 'F');
    建立的函数:CREATE OR REPLACE FUNCTION FunctionT97(strIDS VARCHAR2)
    RETURN VARCHAR2
    IS
        -- 定义字符串数组类型
        TYPE Varchar2Array IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER;
        TmpeStr VARCHAR2(32);
        Str    VARCHAR2(4000);
        j      INTEGER;
        -- 定义数组
        Arr Varchar2Array;
        -- 保存返回的最终结果
        strResult VARCHAR2(200) := '';
        vName VARCHAR2(20);    
        
    BEGIN
        -- 将传递进来的用,分隔的字符串转换为数组
        Str := strIDS;
        j := 0;
        IF Instr(strIDS, ',', 1, 1) = 0 THEN
          Arr(j) := strIDS;      
          j := j + 1;
        else
          While Instr(str, ',', 1, 1) > 0 Loop
            TmpeStr := Substr(str, 1, Instr(str, ',', 1, 1) - 1);      
            Arr(j) := TmpeStr;        
            str := SubStr(Str, Instr(str, ',', 1, 1) + 1, length(str));
            j := j + 1;
          end loop;
          if not str is null then
           --将最后一个保存
            Arr(j) := str;        
            j := j + 1;
          end if;
        end if;    
        
        FOR k IN 0..Arr.count - 1 LOOP
            SELECT MyName INTO vName FROM T97 WHERE ID = Arr(k);
            strResult := strResult || vName || ', ';
        END LOOP;
        -- 处理掉最后一个,号
        strResult := substr(strResult, 1, length(strResult) - 2);    
        RETURN strResult;
    END FunctionT97;
    实测结果:
      

  2.   

    --返回从第一行开始 它所有的后续记录  (-->)字符你可以换成你需要的逗号(,)
    select 'test1-->' || replace(wm_concat(distinct formerval), ',', '-->') as allPath
      from (
              --返回记录中上行行中,同一列对应的值,改造成简单的父子关系表
              select h.fId,
                   h.fName as formerval,
                   lag(h.fName) over(order by h.fId) as lastval
              from (
                   --伪造一个ID,Name 的六行记录 不想创建表了 末有办法 :)
                   select rownum as fId, 'test' || rownum as fName
                      from dual
                    connect by rownum < 7) h
              )
     start with lastval = 'test1'
    connect by lastval = prior formerval
      

  3.   

    少年,人家需求很清楚 “如何写function 方法”