千家信息网

【原创】Oracle实现PGSQL的generate_series

发表于:2025-02-04 作者:千家信息网编辑
千家信息网最后更新 2025年02月04日,PostgreSQL 有生成序列的函数,可以方便的进行造数据。这里我用ORACLE实现了PGSQL的generate_series函数功能。POSTGRESQL.t_girl=# select * f
千家信息网最后更新 2025年02月04日【原创】Oracle实现PGSQL的generate_series

PostgreSQL 有生成序列的函数,可以方便的进行造数据。这里我用ORACLE实现了PGSQL的generate_series函数功能。

POSTGRESQL.

t_girl=# select * from generate_series(1,10); generate_series-----------------               1               2               3               4               5               6               7               8               9              10(10 行记录)时间:1.290 mst_girl=# select * from generate_series(1,10,2); generate_series-----------------               1               3               5               7               9(5 行记录)时间:0.431 mst_girl=# select * from generate_series(1,10,3); generate_series-----------------               1               4               7              10(4 行记录)时间:0.879 mst_girl=# select * from generate_series(2,10,3); generate_series-----------------               2               5               8(3 行记录)时间:0.867 mst_girl=# select count(*) from generate_series(1,1000); count-------  1000(1 行记录)时间:1.142 mst_girl=# select to_char(now() - '1 day'::interval * n,'YYYY-MM-DD') as result from generate_series(1,10)  g(n);   result------------ 2015-12-08 2015-12-07 2015-12-06 2015-12-05 2015-12-04 2015-12-03 2015-12-02 2015-12-01 2015-11-30 2015-11-29(10 行记录)时间:17.284 ms


ORACLE:

12:10:34 SQL> select * from table(ytt_generate_series(1,10));COLUMN_VALUE                                                                    ------------                                                                               1                                                                               2                                                                               3                                                                               4                                                                               5                                                                               6                                                                               7                                                                               8                                                                               9                                                                              10                                                                    已选择 10 行。已用时间:  00: 00: 00.0212:10:36 SQL> select * from table(ytt_generate_series(1,10,2));COLUMN_VALUE                                                                    ------------                                                                               1                                                                               3                                                                               5                                                                               7                                                                               9                                                                    已用时间:  00: 00: 00.0012:10:54 SQL> select * from table(ytt_generate_series(1,10,3));COLUMN_VALUE                                                                    ------------                                                                               1                                                                               4                                                                               7                                                                              10                                                                    已用时间:  00: 00: 00.0012:10:56 SQL> select * from table(ytt_generate_series(2,10,3));COLUMN_VALUE                                                                    ------------                                                                               2                                                                               5                                                                               8                                                                    已用时间:  00: 00: 00.0212:11:04 SQL> select count(*) from table(ytt_generate_series(1,1000));  COUNT(*)                                                                      ----------                                                                            1000                                                                      已用时间:  00: 00: 00.1313:32:13 SQL> select to_char(sysdate - n,'YYYY-MM-DD') from table(ytt_generate_series(1,10));TO_CHAR(SY----------2015-12-082015-12-072015-12-062015-12-052015-12-042015-12-032015-12-022015-12-012015-11-302015-11-29已选择 10 行。已用时间:  00: 00: 00.01



附上代码:

-- Declare result set.create or replace type ytt_num is object( n number);/create or replace type numbers_table is table of ytt_num;/-- Function body.-- Created by ytt.-- 2015/12/9create or replace function ytt_generate_series(f_start_num number := 1, -- Start number.f_end_num number,  -- Finish number.f_step_num number := 1 -- Step.)return numbers_table pipelinedis   list numbers_table := numbers_table();  i number := 0;  j number := 1;begin  i := f_start_num;  j := 1;  -- Increase nested table's size.  list.extend(f_end_num);  -- Loop begin.  while i <= f_end_num loop  -- Initlization.    list(j) := ytt_num(null);    list(j).n := i;    pipe row(list(j));    i := i + f_step_num;    j := j + 1;  end loop;  return;end;/


0