(
varYearID IN NUMBER, -- 年度标识
varSpecID IN NUMBER -- 投资结构节点标识
)
RETURN NUMBER_SET DETERMINISTIC PIPELINED IS
varNodesString VARCHAR2(2000);
varNodeID VARCHAR2(100);
i INTEGER;
BEGIN
varNodesString := f_getsubspecstring(varYearID, varSpecID);
i := INSTR(varNodesString, ',');
WHILE i <> 0 LOOP
varNodeID := SUBSTR(varNodesString,1, i - 1);
PIPE ROW(varNodeID);
varNodesString := SUBSTR(varNodesString, i + 1);
i := INSTR(varNodesString, ',');
END LOOP;
IF varNodesString IS NOT NULL THEN
PIPE ROW(varNodeID);
END IF;
这样可以吗?
SQL> create table tmp
2 (
3 name varchar2(40),
4 ny varchar2(10),
5 str varchar2(100)
6 )
7 /
Table created.
SQL> insert into tmp values ('aa', '200607', '6,7');
1 row created.
SQL> insert into tmp values ('bb', '200608', '4,5,6,7,8,9');
1 row created.
SQL> select * from tmp
2 /
NAME NY STR
---------------------------------------- ---------- ------------------------------------------------
aa 200607 6,7
bb 200608 4,5,6,7,8,9
SQL> create or replace procedure substring_array(name varchar2, ny varchar2, str in varchar2) as
2 type array_str is table of varchar2(100)
3 index by binary_integer;
4 myarray array_str;
5 v_str varchar2(4000) default str;
6 begin
7 for i in 0 .. length(str)-length(replace(str,',',''))+1 loop
8
9 if instr(v_str,',') = 0 then
10 myarray(i+1) := v_str ;
11 else
12 myarray(i+1) := substr(v_str,0,instr(v_str,',')-1);
13 end if;
14 v_str := substr(v_str,instr(v_str,',')+1);
15 end loop;
16
17 for i in 0 ..length(str)-length(replace(str,',','')) loop
18 dbms_output.put_line(name || ' ' || ny || ' ' || myarray(i+1));
19 end loop ;
20 end substring_array;
21 /
Procedure created.
SQL> declare
2 name varchar2(40);
3 ny varchar2(10);
4 str varchar2(100);
5 begin
6 for c1 in (select name,ny,str from tmp)
7 loop
8 substring_array(c1.name,c1.ny,c1.str);
9 end loop;
10 end;
11 /
aa 200607 6
aa 200607 7
bb 200608 4
bb 200608 5
bb 200608 6
bb 200608 7
bb 200608 8
bb 200608 9