prog:oracle_row_sql_generation
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
Quellen
prog/oracle_row_sql_generation.txt · Zuletzt geändert: 2016/10/17 12:13 von gpipperr