CREATE OR REPLACE FUNCTION fn_SplitStringAsTable(
w_col1 VARCHAR2,
w_col VARCHAR2
)
RETURN ty_str_split PIPELINED
is
       w_i INT;
 BEGIN
   w_i := length(w_col1)-1;
  WHILE  instr(w_col1,w_col,1)>0  loop
    INSERT ty_str_split VALUES (substr(w_col1,1,instr(w_col1,',')-1));
    w_col1=select substr(w_col1,instr(w_col1,',')+1,length(w_col1)) as result from dual;
    end loop;
  INSERT ty_str_split VALUES (w_col1);
RETURN w_t;
END;编译未通过。不知道哪里有问题。好心人帮个忙啦。

解决方案 »

  1.   

    http://blog.csdn.net/wxf82610/archive/2007/09/18/1789507.aspxinsert into
      

  2.   

    字符串拆分函数吧?
    管道化表函数概念有很大失误。
    直接给你个例子吧。
    CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000);
      CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)
       RETURN ty_str_split PIPELINED
      IS
       j INT := 0;
       i INT := 1;
       len INT := 0;
       len1 INT := 0;
       str VARCHAR2 (4000);
      BEGIN
       len := LENGTH (p_str);
       len1 := LENGTH (p_delimiter);
       WHILE j < len
       LOOP
       j := INSTR (p_str, p_delimiter, i);
       IF j = 0
       THEN
       j := len;
       str := SUBSTR (p_str, i);
       PIPE ROW (str);
       IF i >= len
       THEN
       EXIT;
       END IF;
       ELSE
       str := SUBSTR (p_str, i, j - i);
       i := j + len1;
       PIPE ROW (str);
       END IF;
       END LOOP;
       RETURN;
      END fn_split;
      /
      

  3.   

    给的函数有,不过这个我想知道如何编译不对,除了insert into 管道化表函数概念有很大失误。-- 关于这个概念有没有好的资料参考?谢谢哥们
      

  4.   


    CREATE OR REPLACE FUNCTION fn_SplitStringAsTable(
    w_col1 VARCHAR2,
    w_col VARCHAR2
    )
    RETURN ty_str_split PIPELINED
    is
    w_i INT;
    BEGIN
    w_i := length(w_col1)-1;
    WHILE instr(w_col1,w_col,1)>0 loop
    INSERT ty_str_split VALUES (substr(w_col1,1,instr(w_col1,',')-1));--此处应是insert into
    w_col1=select substr(w_col1,instr(w_col1,',')+1,length(w_col1)) as result from dual;
    --这句不知道你是要做什么。变量赋值应该是w_col1:=.. 列加查询条件应是:where ...
    end loop;
    INSERT ty_str_split VALUES (w_col1);
    RETURN w_t;
    END;总体来说你这个也不是管道化函数,请仔细查看上面给的例子。
      

  5.   

    create or replace function fn_SplitStringAsTable(w_col1 varchar2,w_col varchar2) return varchar2 is
     w_i int;
    begin
      w_i := length(w_col1)-1;
      WHILE instr(w_col1,w_col,1)>0 loop
       INSERT into ty_str_split VALUES (substr(w_col1,1,instr(w_col1,',')-1)); -- insert into
       select substr(w_col1,instr(w_col1,',')+1,length(w_col1)) into w_col1 from dual; -- into 变量
    end loop;
    INSERT ty_str_split VALUES (w_col1);RETURN w_t;  -- w_t不知道从哪来的
    end fn_SplitStringAsTable;
      

  6.   

    return varchar2 is w_i int;这里的类型最好一至;w_col1=select substr(w_col1,instr(w_col1,',')+1,length(w_col1)) as result from dual;
    赋值不对,
    INSERT ty_str_split VALUES (w_col1);
    还有这处没有修改;w_col1只是一个值,应该为
    INSERT into ty_str_split(col_name) VALUES (w_col1);