Object header
create or replace type StringTokenizer as object (
s varchar2(32767),
separator varchar2(32767),
lastSepPosition number,
CONSTRUCTOR FUNCTION StringTokenizer(s varchar2, separator varchar2)
RETURN SELF AS RESULT,
member function privNextToken(self in out StringTokenizer) return varchar2,
member function nextToken(self in out StringTokenizer) return varchar2,
member function hasNext(self in out StringTokenizer) return boolean
)
INSTANTIABLE FINAL
Object body
create or replace type BODY StringTokenizer as
CONSTRUCTOR FUNCTION StringTokenizer(s varchar2, separator varchar2)
RETURN SELF AS RESULT
AS
BEGIN
SELF.s := s;
self.separator := separator;
self.lastSepPosition := 1;
RETURN;
END;
--
member function privNextToken(self in out StringTokenizer) return varchar2 is
result varchar2(32767);
sepPosition number;
begin
--dbms_output.put_line('instr(''' || s || ''', ''' || separator || ''',''' || lastSepPosition || ''')');
sepPosition := instr(s, separator, lastSepPosition);
if(sepPosition = 0) then
sepPosition := length(s)+1;
end if;
--dbms_output.put_line(sepPosition);
--dbms_output.put_line('substr(''' || s || ''', ''' || lastSepPosition || ''', ''' || (sepPosition-lastSepPosition) || ''')');
result := substr(s, lastSepPosition, sepPosition-lastSepPosition);
lastSepPosition := sepPosition+length(separator);
return result;
end;
--
member function nextToken(self in out StringTokenizer) return varchar2 is
result varchar2(32767) := null;
begin
while(hasNext) loop
result := privNextToken();
if(not result is null and length(result)>0) then
exit;
end if;
end loop;
--dbms_output.put_line('returning ' || result || '*');
return result;
end;
--
member function hasNext(self in out StringTokenizer) return boolean is
begin
return lastSepPosition<length(s);
end;
end;
Test
declare
o StringTokenizer;
begin
o := StringTokenizer('pippo@@pluto@@paperino', '@@');
while(o.hasNext) loop
dbms_output.put_line(o.nextTOken);
end loop;
dbms_output.put_line('***end***');
end;
/
-----------
pippo
pluto
paperino
***end***
|