AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 15994
Accepted
René Nyffenegger
René Nyffenegger
Asked: 2012-04-04 01:31:18 +0800 CST2012-04-04 01:31:18 +0800 CST 2012-04-04 01:31:18 +0800 CST

如果我在 SQL*Plus 中设置 ARRAYSIZE 1,记录仍然是成对获取的。为什么?

  • 772

我考虑编写一个简单 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. 然而,记录(除了第一个)是成对获取的。

对此有解释吗?如何在管道传输后立即获取记录?

oracle sqlplus
  • 2 2 个回答
  • 1786 Views

2 个回答

  • Voted
  1. Best Answer
    Philᵀᴹ
    2012-04-04T02:57:00+08:002012-04-04T02:57:00+08:00

    Metalink 错误 9103343 指出:

    这是预期的行为。SQL*Plus 是用 oci 编写的,oci 的默认预取值为 1 行。但是,仅当您不执行数组提取时才会在提取时进行预取(而不是在执行时),因此当 arraysize 为 1 时。不管 arraysize 是什么,跟踪中的第一个提取始终是 1 行,因为 1 行是预取的执行。然后它要么执行一个标量提取,所以一个请求的行加上一个预取的行,或者它执行一个数组提取,所以你看到例如:a)arraysize = 1,提取是:1、2、2,... b)arraysize = 2,取数是:1,2,2,... c) arraysize = 5,取数是:1,5,5,...

    另请参阅 Metalink 文档 1265916.1

    • 9
  2. Jack Douglas
    2012-04-04T03:10:26+08:002012-04-04T03:10:26+08:00

    这似乎是 SQL*Plus 的一个怪癖,arraysize而不是流水线函数 - 下面演示了相同的效果:

    create or replace function pause return integer as
    begin
      dbms_lock.sleep(2);
      return 1;
    end;
    /
    
    select pause from dual connect by level<10;
    

    您可以(在某种程度上)通过选择行两次并每隔一秒丢弃一次来解决该问题:

    select /*+ ordered first_rows(1) */ *
    from table(tail_f) cross join (select level from dual connect by level<=2);
    
    • 5

相关问题

  • Oracle 中的数据库备份 - 导出数据库还是使用其他工具?

  • ORDER BY 使用文本列的自定义优先级

  • 舒服的sqlplus界面?[关闭]

  • 如何在数据库中找到最新的 SQL 语句?

  • 如何使用正则表达式查询名称?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve