Pipelined functions

See Pl/Sql tips
Example, is the systimestamp unique? (yes it is if not parallel)
create or replace type t as object (
 t timestamp(8),
 s varchar2(50)
)

drop type tt

create type tt as table of t

create or replace function tst return tt pipelined is
 d t;
 i number; 
begin
  --open cursor
  begin
    for i in 1 .. 100 loop
      d := t(systimestamp, 'pippo'||i);
      dbms_output.put_line('piping row '||i);
      pipe row(d);
    end loop;
  exception
    when others then
    --close cursor 
    dbms_output.put_line('finished');
  end;
end;

select * from table(tst) where rownum<5