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;编译未通过。不知道哪里有问题。好心人帮个忙啦。
解决方案 »
- 急 请教 oracle 分组 查询
- NTS-03505 未能分解名称,这是为什么呀,急等!
- recover database until cancel using backup controlfile; 是从哪里恢复的控制文件?
- oracle表中有DATE字段 plsql insert如何写,现在的情况报错
- 这是什么错误
- oracle查询的问题
- 请教一过程
- ORA-01461: can bind a long value only for insert into a long column 怎么回事?
- 请众位大侠帮忙看一下这个错误!!!
- 创建数据库的问题
- oracle的pl/sql developer的使用手册???
- suse - oracle OEM 乱码解决(转载)
管道化表函数概念有很大失误。
直接给你个例子吧。
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;
/
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;总体来说你这个也不是管道化函数,请仔细查看上面给的例子。
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;
赋值不对,
INSERT ty_str_split VALUES (w_col1);
还有这处没有修改;w_col1只是一个值,应该为
INSERT into ty_str_split(col_name) VALUES (w_col1);