Benutzer-Werkzeuge

Webseiten-Werkzeuge


prog:oracle_row_sql_generation

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
prog:oracle_row_sql_generation [2016/01/22 10:17]
gpipperr
prog:oracle_row_sql_generation [2016/10/17 12:13] (aktuell)
gpipperr [Dual Tabelle mit Connect By]
Zeile 1: Zeile 1:
 +====SQL Row Generatoren =====
  
 +
 +==== Dual Tabelle mit Connect By ====
 +
 +Vorlaufender Zähler:
 +
 +<code bash>
 +
 +-- 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
 +
 +</code>
 +
 +Problem: Bei größeren Mengen am Zeilen wird relativ viel PGA verbraucht und es kann zu einem Fehler kommen:
 +<code bash>
 +
 +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
 +
 +</code>
 +
 +Lösung: PGA entsprechend groß einstellen ( 5GB reichen für obiges Beispiel nicht!)
 +
 +
 +Alternativ: Temporary Table:
 +<code sql>
 +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;
 +
 +</code>
 +
 +----
 +
 +==== Dual Tabelle mit CUBE ====
 +
 +X Zeilen mit gleichen Wert erzeugen
 +
 +Cube bilden (n hoch 2 pro cube Spalte )
 +
 +<code bash>
 +
 +SQL>select 1 from dual group by cube(1,2);
 +
 +           1
 +------------
 +           1
 +           1
 +           1
 +           1
 +</code>
 +
 +
 +----
 +
 +==== Rekursives SQL verwenden ====
 +**11g**
 +
 +<code bash>
 +
 +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
 +          
 +</code>
 +
 +
 +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
"Autor: Gunther Pipperr"
prog/oracle_row_sql_generation.txt · Zuletzt geändert: 2016/10/17 12:13 von gpipperr