【问题标题】:Oracle - The lowest VARCHAR2 valueOracle - 最低的 VARCHAR2 值
【发布时间】:2013-12-26 17:53:54
【问题描述】:

我需要查询数据库中的一个表,该表的列是VARCHAR2。 我需要分块检索记录,而不是一次全部检索。 ROWNUM 用于此目的。

查询是这样的:

select * from SOMETABLE
where SOMECOLUMN > ?
and rownum <= 100
order by SOMECOLUMN

通过更改SOMECOLUMN 值重复运行此查询。首先,应该为这个查询提供最少的 VARCAHAR2 值,以便我获得前 100 条记录(尽管不是按任何特定顺序)。下一次,使用第 100 条记录中的 SOMECOLUMN 值(为此目的将order by 添加到查询中),以便获取接下来的 100 条记录,依此类推。

(假设:SOMECOLUMN 值是唯一的)。

提供给该查询的初始最小值是多少?

【问题讨论】:

  • 您需要以块的形式检索它们,或者以块的形式处理它们——您只是为了显示而分页吗?您使用什么机制来检索它们?我想知道您是否可以查询所有记录但只是批量获取它们,这意味着 Oracle 会有效地为您处理这些东西。如果您的查询之间的数据发生变化,并且您正在处理该表中的更改数据(特别是 somecolumn 值),您会在查询之间提交这些更改吗?
  • 但是回到您的问题...您的NLS 设置将影响排序顺序,因此会影响“最低”值。 somecolumn 是否已编入索引?您可以选择min() 值并与之比较?
  • 我的处理不会改变数据;它只读取;但是,数据可以由其他进程更新。 SOMECOLUMN 始终按递增顺序排列。这是一个读取数据并生成文本文件的批处理过程。所以即使这次遗漏了一些数据,下次它也会选择新添加的数据。 Oracle 如何分块处理这种读取? NLS 如何影响最低值?
  • 一般Oracle不支持分块获取!您的本地 NLS 设置定义了文本的排序方式,例如处理小写和大写文本。
  • SOMECOLUMN 是某种时间戳还是什么?它是否会因特定记录而改变?您是否有任何标志或其他方法可以意识到自上次批处理运行以来某些记录已更新?

标签: oracle varchar2


【解决方案1】:

您也可以将MIN()MAX() 用于VARCHAR2 数据,而不仅仅是数字。你可以用这个:

with t as
   (select SOMETABLE.*, rownum as THE_ROW from SOMETABLE order by SOMECOLUMN)
select *
from t
where THE_ROW between 1 and 100 -- (-> between 101 and 200, between 201 and 300 ...)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
相关资源
最近更新 更多