在min_value和max_value oracle之间生成数字

sai*_*arm 3 sql oracle performance

我有两种方法可以解决,但两种方法的效率都很低,无法使用10 8或更高的数值.

方法1

 select 100 + rownum - 1 from dual connect by level <= (200 - 100 + 1)
Run Code Online (Sandbox Code Playgroud)

方法2

select rownum + 100 - 1
from (select 1 from dual group by cube(1, 2, 3, 4, 5, 6, 7, 8, 9))
where rownum < (200 - 100 + 1)
Run Code Online (Sandbox Code Playgroud)

但是当最大值为100,000,000时第一种方法失败,第二种方法需要大量时间来处理.

请提出一个有效的方法,我可以想到序列,但我想时间成本会更高.

更新

第一种方法出错

ORA-30009:没有足够的内存用于CONNECT BY操作

a_h*_*ame 8

对于那么多行,流水线函数可能是最好的解决方案:

create or replace TYPE t_numbers IS TABLE OF NUMBER;
/

create or replace function generate_series(p_min integer, p_max integer)
  return t_numbers pipelined
as  
begin
  for i in p_min..p_max loop
    pipe row (i);
  end loop;
end;
/
Run Code Online (Sandbox Code Playgroud)

一个简单的:

select count(*)
from table(generate_series(1,100000000));
Run Code Online (Sandbox Code Playgroud)

我的笔记本电脑大约需要30秒