====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