生成算术序列

fa1*_*n3r 2 oracle oracle-11g sequence

我想在一个WITH包含这个等差数列的子句中生成一个命名表:

????????????
? mynumber ?
????????????
?        0 ?
?       30 ?
?       60 ?
?       90 ?
?      120 ?
?      150 ?
?      180 ?
?      210 ?
????????????
Run Code Online (Sandbox Code Playgroud)

...基于变量p_maxnumberp_maxnumber例如此处= 211)。

理想情况下,它将采用以下格式:

WITH sequenceTable AS
(SELECT mynumber
FROM ...),
Run Code Online (Sandbox Code Playgroud)

在同一WITH个子句中,我想在下游派生表中使用该序列来获取数据并最终用作图表呈现的时间轴。我有一种感觉有一种方法可以使用创建序列来做到这一点?只是想找到一种方法来创造这个仍然......

Vin*_*rat 5

您可以使用 CONNECT BY 查询生成任意序列:

SQL> variable v_step NUMBER
SQL> variable v_maxnumber NUMBER
SQL> exec :v_step := 30; :v_maxnumber := 211;

PL/SQL procedure successfully completed

SQL> WITH sequenceTable AS (
  2     SELECT (LEVEL - 1) * :v_step myNumber
  3       FROM DUAL
  4     CONNECT BY (LEVEL - 1) * :v_step <= :v_maxnumber)
  5  SELECT * FROM sequenceTable;

  MYNUMBER
----------
         0
        30
        60
        90
       120
       150
       180
       210

8 rows selected
Run Code Online (Sandbox Code Playgroud)

您还可以使用流水线函数:

SQL> CREATE OR REPLACE TYPE tab_number IS TABLE OF NUMBER;
  2  /

Type created

SQL> CREATE OR REPLACE FUNCTION arithmetic_sequence (p_step NUMBER, p_maxvalue NUMBER)
  2     RETURN tab_number
  3     PIPELINED
  4  IS
  5  BEGIN
  6     FOR i IN 0..p_maxvalue/p_step LOOP
  7        PIPE ROW (i*p_step);
  8     END LOOP;
  9     RETURN;
 10  END;
 11  /

Function created

SQL> SELECT COLUMN_VALUE myNumber FROM TABLE(arithmetic_sequence(30, 211));

  MYNUMBER
----------
         0
        30
        60
        90
       120
       150
       180
       210

8 rows selected
Run Code Online (Sandbox Code Playgroud)