Inhaltsverzeichnis

SQL Row Generatoren

Dual Tabelle mit Connect By

Vorlaufender Zähler:

-- vor 10g
 select level-1 
   from dual 
connect by level < 4
/
 
Level
-------
0
1
2
 
--ab 10g
 
SELECT rownum x
FROM   ( SELECT 1 as col
         FROM   dual
         CONNECT BY LEVEL <= 7
       )
X
---
1
2       
...
7

Problem: Bei größeren Mengen am Zeilen wird relativ viel PGA verbraucht und es kann zu einem Fehler kommen:

SQL>select count(*) from (select level from dual connect by level < 100000000);
                                        *
FEHLER in Zeile 1:
ORA-30009: Nicht genügend Speicher für CONNECT BY-Vorgang

Lösung: PGA entsprechend groß einstellen ( 5GB reichen für obiges Beispiel nicht!)

Alternativ: Temporary Table:

WITH row_list AS (
  SELECT /*+ MATERIALIZE */ level AS id
  FROM   dual
  CONNECT BY level <= 10000
)
SELECT rownum AS id
FROM   row_list , row_list,row_list
WHERE  rownum <= 1000000;

Dual Tabelle mit CUBE

X Zeilen mit gleichen Wert erzeugen

Cube bilden (n hoch 2 pro cube Spalte )

SQL>select 1 from dual group by cube(1,2);
 
           1
------------
           1
           1
           1
           1

Rekursives SQL verwenden

11g

with v_nums(n) as (
     select 1 as n from dual
     union all
     select n+1 from v_nums where n < 3
 )
 select n from v_nums
/
 
 
          N
-----------
          1
          2
          3
 

zu Rekursive SQL siehe:


pipelined function

Dazu siehe Eine dynamische Kreuz - (Pivot) Tabelle anlegen


Quellen