You could simulate it with a pipelined function, eg
SQL> create sequence seq;
Sequence created.
SQL> create table t ( id int default seq.nextval primary key, d date default sysdate, data varchar2(20) );
Table created.
SQL> create or replace
2 function tail(p_start_Id int) return sys.odcivarchar2list pipelined is
3 l_max_id int := p_start_id;
4 begin
5 loop
6 for i in ( select * from t where id > l_max_id )
7 loop
8 pipe row ( rpad(i.id,10)||rpad(to_char(i.d,'HH24:MI:SS'),15)||i.data );
9 l_max_id := i.id;
10 end loop;
11
12 dbms_lock.sleep(5);
13 end loop;
14 end;
15 /
Function created.
--
-- Session 1, adding rows to table every second
--
SQL> begin
2 for i in 1 .. 1000 loop
3 insert into t (data ) values ( 'My data '||i);
4 commit;
5 dbms_lock.sleep(1);
6 end loop;
7 end;
8 /
--
-- Session 2, tail function
--
SQL> set arraysize 5
SQL> select * from table(tail(0));
COLUMN_VALUE
----------------------------------------------------------
1 13:41:22 My data 1
2 13:41:23 My data 2
3 13:41:24 My data 3
4 13:41:25 My data 4
5 13:41:26 My data 5
6 13:41:27 My data 6
7 13:41:28 My data 7
8 13:41:29 My data 8
9 13:41:30 My data 9
10 13:41:31 My data 10
11 13:41:32 My data 11
12 13:41:33 My data 12
13 13:41:34 My data 13
14 13:41:35 My data 14
15 13:41:36 My data 15
...
...
You'd need to add some smarts perhaps in there to be able to stop it (eg it reads a signal via dbms_application_info).