我考虑编写一个简单 tail -f
的类似实用程序来“跟踪”数据库中某些数字的进度:
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;
然后我想select * from table(tail_f)
在 SQL*Plus 中。
为了一一获取行,我SET ARRAYSIZE 1
. 然而,记录(除了第一个)是成对获取的。
对此有解释吗?如何在管道传输后立即获取记录?
Metalink 错误 9103343 指出:
另请参阅 Metalink 文档 1265916.1
这似乎是 SQL*Plus 的一个怪癖,
arraysize
而不是流水线函数 - 下面演示了相同的效果:您可以(在某种程度上)通过选择行两次并每隔一秒丢弃一次来解决该问题: