Pensei em escrever um utilitário like simples tail -f
para "rastrear" o andamento de algumas figuras dentro do banco de dados:
create or replace function tail_f return varchar2_tab pipelined as
n number;
begin
loop
exit when ...
select count(*) into n from ... where ...;
pipe row(sysdate || ' n= ' || n);
dbms_lock.sleep(60);
end loop;
return;
end tail_f;
E então eu gostaria select * from table(tail_f)
no SQL*Plus.
Para buscar as linhas uma a uma, eu SET ARRAYSIZE 1
. Ainda, os registros (exceto o primeiro) são buscados em pares.
Existe uma explicação para isso e como posso obter os registros assim que um for canalizado?
O bug Metalink 9103343 afirma:
Veja também Metalink doc 1265916.1
Isso parece ser uma peculiaridade do SQL*Plus e
arraysize
, em vez de funções em pipeline - o seguinte demonstra o mesmo efeito:Você pode (mais ou menos) solucionar o problema selecionando as linhas duas vezes e descartando a cada segundo: