====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:
* http://www.mayeruli.de/db2/rekursives-sql.html
* http://wikis.gm.fh-koeln.de/wiki_db/Datenbanken/WITH-Klausel
* http://www.infosys.tuwien.ac.at/teaching/courses/WebEngineering/SQL_Rekursive_Anfragen.pdf
----
====pipelined function ====
Dazu siehe [[prog:sql_piviot|Eine dynamische Kreuz - (Pivot) Tabelle anlegen]]
----
===== Quellen =====
* http://method-r.com/papers
* http://www.orafaq.com/wiki/Oracle_Row_Generator_Techniques