SlideShare ist ein Scribd-Unternehmen logo
1 von 39
Downloaden Sie, um offline zu lesen
Polymorphic Table Functions
in 18c
Andrej Pashchenko
@Andrej_SQL doag2018
Wir helfen Mehrwerte aus Daten zu generieren
Polymorphic Table Functions in 18c: Einführung und Beispiele2 20.11.2018
Mit über 650 IT- und Fachexperten bei Ihnen vor Ort.
Polymorphic Table Functions in 18c: Einführung und Beispiele3 20.11.2018
16 Trivadis Niederlassungen mit
über 650 Mitarbeitenden.
Erfahrung aus mehr als 1'900 Projekten
pro Jahr bei über 800 Kunden.
Über 250 Service Level Agreements.
Mehr als 4'000 Trainingsteilnehmer.
Forschungs- und Entwicklungsbudget:
CHF 5.0 Mio. / EUR 4.0 Mio.
Finanziell unabhängig und
nachhaltig profitabel.
Über mich
Polymorphic Table Functions in 18c: Einführung und Beispiele4 20.11.2018
Senior Consultant bei der Trivadis GmbH, Düsseldorf
Schwerpunkt Oracle
– Data Warehousing
– Application Development
– Application Performance
Kurs-Referent „Oracle 12c New Features für Entwickler“
und „Beyond SQL and PL/SQL“
Blog: http://blog.sqlora.com
Tabellenfunktionen vor 18c
Polymorphic Table Functions in 18c: Einführung und Beispiele6 20.11.2018
Tabellenfunktionen schon länger bekannt (8i)
Der Collection Typ der Rückgabe muss vorher deklariert werden
Das Weiterleiten des Datenstroms in die Funktion in einer SQL-Abfrage ist nicht
trivial (CURSOR-Parameter)
Eigene Aggregatfunktionen mit Oracle Data Cartridge Interface (ODCI)
CREATE OR REPLACE TYPE names_t IS TABLE OF VARCHAR2 (100);
SELECT t.*
FROM TABLE(get_emp_names()) t;
SMITH
ALLEN
WARD
JONES
Polymorphe Tabellenfunktionen (PTF)
Polymorphic Table Functions in 18c: Einführung und Beispiele7 20.11.2018
Evolution von Tabellenfunktionen: Teil von ANSI SQL2016
Komplizierte Geschäftslogik abstrahieren und generisch auf SQL-Ebene zur
Verfügung zu stellen
SELECT aus der Funktion in der FROM-Klausel
Wie eine View, nur prozeduraler und dynamischer (ohne dynamisches SQL)
Polymorph: eine PTF unterstützt unterschiedliche Eingabe- und Ausgabe-
Datenstrukturen:
– Kann generische Tabellenparameter akzeptieren, deren Datensatzstruktur bei der Definition
nicht bekannt sein muss. Oracle: genau ein Tabellenparameter ist Pflicht in 18c
– Der Rückgabe-Tabellentyp muss nicht bei der Definition deklariert sein, hängt von der
Eingabestruktur und zusätzlichen Funktionsparametren ab
Polymorphe Tabellenfunktionen (PTF)
Polymorphic Table Functions in 18c: Einführung und Beispiele8 20.11.2018
Rollen:
– PTF-Entwickler implementiert den prozeduralen Mechanismus für die Lösung der
Anforderungen an die PTF und veröffentlicht die Schnittstelle
– Abfragen-Entwickler ruft die PTF in der SQL-Abfrage auf
– DBMS ist für Kompilierung (Parsing), Ausführung von SQL zuständig und
übernimmt viele technische Aspekte: parallele Ausführung, Datenübergabe in die /
aus der Funktion, Zustandsverwaltung, etc.
Oracle stellt dem PTF-Entwickler die Infrastruktur im Package DBMS_TF sowie
einen neuen SQL-Operator COLUMNS() zur Verfügung
PTF-Entwickler kann sich auf der fachlichen Aufgabe konzentrieren.
Polymorphe Tabellenfunktionen (PTF)
Polymorphic Table Functions in 18c: Einführung und Beispiele9 20.11.2018
A B C
- - -
- - -
- - -
- - -
C1 C2 C3
- - -
- - -
- - -
- - -
A B D
- - -
- - -
- - -
- - -
- - -
Polymorphic Table Function
add/remove rows,
add/remove columns
Not
allowed!
Table T
MY_PTF( )
SELECT a,b,d
FROM MY_PTF(t);
Beispielaufgabe für die erste PTF
Polymorphic Table Functions in 18c: Einführung und Beispiele10 20.11.2018
Nur eine definierte Liste der Spalten der Quelltabelle in der Ausgabe behalten.
Die restlichen (versteckten) Spalten mit einem Trennzeichen zusammenfügen und
als neue Spalte darstellen
MY_PTF
SELECT a,b,d FROM MY_PTF(t, COLUMNS(a,b));
Passt zur Beispielaufgabe
Typen von PTF
Polymorphic Table Functions in 18c: Einführung und Beispiele11 20.11.2018
Jeder Ergebnis-Datensatz kann
ausschließlich aus dem laufenden
Quell-Datensatz abgeleitet werden
Anwendungsbeispiele:
– Hinzufügen neuer berechneter Spalten
– Umformatieren des Datensatzes
– Ausgabe in einem speziellen Format
(JSON, CSV, etc.)
– Replikation
– Pivot / Transponieren
Das Ergebnis-Datensatz ergibt sich aus
der Betrachtung vom laufenden Quell-
Datensatz und bereits verarbeiteten
Datensätze
Arbeitet auf der ganzen Tabelle bzw.
einer (logischen) Partition davon
Input-Tabelle kann optional partitioniert
und sortiert werden
Anwendungsbeispiele:
– Benutzerdefinierte Aggregat- /
Fensterfunktionen
PTF
Row-Semantic Table-Semantic
Interface-Methoden
Polymorphic Table Functions in 18c: Einführung und Beispiele12 20.11.2018
Jede PTF braucht ein Implementierungs-Package, das die Implementierung der
Interface-Methoden bereitstellt:
DESCRIBE OPEN FETCH_ROWS CLOSE
Kompilierungsphase Ausführungsphase
Beschreibt das
Format der
Ergebnis-Tabelle
Setup Quell-Datensätze
verarbeiten und
Ergebnis produzieren
Cleanup
Pflicht! optional optional optional
Definition: Package und PTF
Polymorphic Table Functions in 18c: Einführung und Beispiele13 20.11.2018
CREATE OR REPLACE PACKAGE my_ptf_package AS
FUNCTION describe (tab IN OUT dbms_tf.table_t, cols2stay IN dbms_tf.columns_t )
RETURN dbms_tf.describe_t;
PROCEDURE fetch_rows;
-- Not required for now
--PROCEDURE open;
--PROCEDURE close;
END my_ptf_package;
/
CREATE OR REPLACE FUNCTION my_ptf (tab TABLE, cols2stay COLUMNS )
RETURN TABLE PIPELINED ROW POLYMORPHIC USING my_ptf_package;
Spaltenliste: diese
Spalten wollen wir
beibehalten
DESCRIBE
Polymorphic Table Functions in 18c: Einführung und Beispiele14 20.11.2018
die Methode wird beim Parsen von SQL von der DB aufgerufen, kann nicht explizit
aufgerufen werden
definiert die Struktur der Rückgabe-Tabelle ausgehend von:
– der Struktur der Input-Tabelle
– weiteren Parametern
die DB wandelt die Tabellen-Metadaten in DBMS_TF.TABLE_T, die evtl. vorhandenen
Columns-Parameter – in DBMS_TF.COLUMNS_T um
liefert die Metadaten über die neuen Spalten zurück - DBMS_TF.DESCRIBE_T
außerdem können die Spalten der Input-Tabelle als „pass-through“ oder „for read“
markiert werden (DBMS_TF.TABLE_T ist ein IN OUT Parameter)
PASS-THROUGH und FOR READ Spalten
Polymorphic Table Functions in 18c: Einführung und Beispiele15 20.11.2018
A B C D E
- - - - -
- - - - -
- - - - -
- - - - -
D E F G
- - -
- - -
- - -
- - -
FOR_READ
Table T
MY_PTF( )
SELECT *
FROM MY_PTF(t);PASS_THROUGH
new columns F and G
PASS-THROUGH und FOR READ Spalten
Polymorphic Table Functions in 18c: Einführung und Beispiele16 20.11.2018
PASS THROUGH
Werden ohne Änderung in das
Ergebnis weitergeleitet
Defaults:
– Row Semantic – alle Spalten
– Table Semantic – keine Spalten, außer
Partitioning-Klausel*
FOR READ
Nur diese Spalten werden in
FETCH_ROWS abrufbar.
Default- keine Spalten
Beide Eigenschaften schließen sich gegenseitig NICHT aus!
Spalten im Parameter COLS2STAY
sind PASS_THROUGH, alle
anderen FOR_READ
* - in 18.1 funktioniert es nicht. Bug?
Implementierung DESCRIBE
Polymorphic Table Functions in 18c: Einführung und Beispiele17 20.11.2018
…
FUNCTION describe (tab IN OUT dbms_tf.table_t, cols2stay IN dbms_tf.columns_t )
RETURN dbms_tf.describe_t IS
new_col_name CONSTANT VARCHAR2(30) := 'AGG_COL';
BEGIN
FOR I IN 1 .. tab.COLUMN.COUNT LOOP
IF NOT tab.COLUMN(i).description.name MEMBER OF cols2stay THEN
tab.column(i).pass_through := false;
tab.column(i).for_read := true;
END IF;
END LOOP;
RETURN dbms_tf.describe_t( new_columns =>
dbms_tf.columns_new_t( 1 => dbms_tf.column_metadata_t(
name => new_col_name,
TYPE => dbms_tf.type_varchar2)));
END;
…
Diese Spalten verstecken
und aggregieren
Default=true
für alle anderen
Metadaten für die
neue Spalte
Implementierung FETCH_ROWS
Polymorphic Table Functions in 18c: Einführung und Beispiele18 20.11.2018
Kontext DESCRIBE
FOR READ Columns
New Columns
PASS_THROUGH columns
Kontext FETCH_ROWS
GET-Columns
PUT-Columns
Nicht sichtbar in FETCH_ROWS
Struktur von ROWSET
Polymorphic Table Functions in 18c: Einführung und Beispiele19 20.11.2018
Implementierung FETCH_ROWS
Polymorphic Table Functions in 18c: Einführung und Beispiele20 20.11.2018
…
PROCEDURE fetch_rows IS
rowset dbms_tf.row_set_t;
colcnt PLS_INTEGER;
rowcnt PLS_INTEGER;
agg_col dbms_tf.tab_varchar2_t;
BEGIN
dbms_tf.get_row_set(rowset, rowcnt, colcnt);
FOR r IN 1..rowcnt LOOP
agg_col(r) := '';
FOR c IN 1..colcnt LOOP
agg_col(r) := agg_col(r)||';'||DBMS_TF.COL_TO_CHAR(rowset(c), r);
END LOOP;
agg_col(r) := ltrim (agg_col(r) ,';');
END LOOP;
dbms_tf.put_col(1, agg_col);
END;
…
Read Columns fetchen
Aggregation durchführen
Daten für die neue Spalte
zurückgeben
Polymorphismus in der Praxis
Polymorphic Table Functions in 18c: Einführung und Beispiele21 20.11.2018
SQL> SELECT * FROM my_ptf(t, COLUMNS(A));
A AGG_COL
---------- --------------------------------------------------
1 2;3;"ONE"
4 5;6;"TWO"
7 8;9;"THREE"
SQL> SELECT * FROM my_ptf(t, COLUMNS(A,B));
A B AGG_COL
---------- ---------- --------------------------------------------------
1 2 3;"ONE"
4 5 6;"TWO"
7 8 9;"THREE"
SQL> SELECT * FROM my_ptf(scott.emp, COLUMNS(empno));
EMPNO AGG_COL
---------- --------------------------------------------------
7369 "SMITH";"CLERK";7902;"17-DEC-80";800;;20
7499 "ALLEN";"SALESMAN";7698;"20-FEB-81";1600;300;30
7521 "WARD";"SALESMAN";7698;"22-FEB-81";1250;500;30
Aufgabe 2 = Aufgabe 1 + JSON-Format
Polymorphic Table Functions in 18c: Einführung und Beispiele22 20.11.2018
Nur eine definierte Liste der Spalten der Quelltabelle in der Ausgabe behalten.
Die restlichen (versteckten) Spalten als JSON-Dokument ausgeben
SPLIT_JSON
SELECT a,b, json_col FROM split_json(t, COLUMNS(a,b));
Implementierung für Aufgabe 2
Polymorphic Table Functions in 18c: Einführung und Beispiele23 20.11.2018
…
FUNCTION describe …
PROCEDURE fetch_rows IS
rowset dbms_tf.row_set_t;
rowcnt PLS_INTEGER;
json_col dbms_tf.tab_varchar2_t;
BEGIN
dbms_tf.get_row_set(rowset, rowcnt);
FOR r IN 1..rowcnt LOOP
json_col(r) := DBMS_TF.ROW_TO_CHAR(rowset, r, DBMS_TF.FORMAT_JSON);
END LOOP;
dbms_tf.put_col(1, json_col);
END;…
DESCRIBE ändert sich
nicht…
Row Set als JSON
ausgeben
SPLIT_JSON
Polymorphic Table Functions in 18c: Einführung und Beispiele24 20.11.2018
SQL> SELECT * FROM split_json(t, COLUMNS(A));
A JSON_COL
---------- -------------------------------------
1 {"B":2, "C":3, "V":"ONE"}
4 {"B":5, "C":6, "V":"TWO"}
7 {"B":8, "C":9, "V":"THREE"}
SQL> SELECT * FROM split_json(t, COLUMNS(A,B));
A B JSON_COL
---------- ---------- --------------------------
1 2 {"C":3, "V":"ONE"}
4 5 {"C":6, "V":"TWO"}
7 8 {"C":9, "V":"THREE"}
SQL> SELECT * FROM split_json(scott.emp, COLUMNS(empno));
EMPNO JSON_COL
---------- ----------------------------------------------------------------------
7369 {"ENAME":"SMITH", "JOB":"CLERK", "MGR":7902, "HIREDATE":"17-DEC-80", ...
7499 {"ENAME":"ALLEN", "JOB":"SALESMAN", "MGR":7698, "HIREDATE":"20-FEB-81", ...
7521 {"ENAME":"WARD", "JOB":"SALESMAN", "MGR":7698, "HIREDATE":"22-FEB-81", ...
Aufgabe 3: Spalten zu Zeilen transponieren
Polymorphic Table Functions in 18c: Einführung und Beispiele25 20.11.2018
Nur eine definierte Liste der Spalten der Quelltabelle zur
Identifikation in der Ausgabe behalten.
Die restlichen Spalten als Key-Value Paare darstellen
MY_PTF
SELECT * FROM tab2keyval(t, COLUMNS(a,b));
Mehr Datensätze im
Ergebnis als in der
Quelle?
Row Replication
Polymorphic Table Functions in 18c: Einführung und Beispiele26 20.11.2018
Row Replication erlaubt, Datensätze zu
multiplizieren oder zu auszublenden
DBMS_TF.ROW_REPLICATION
als Faktor für alle Datensätze
oder auf Datensatz-Basis
In DESCRIBE muss ein Flag gesetzt
werden, sonst ORA-62574
Im Moment, die einzige Möglichkeit neue
Datensätze hinzuzufügen. Aber:
PASS_THROUGH Spalten beachten!
Quelle PTF Ergebnis 1:1
Quelle PTF Ergebnis
Ergebnis
Ergebnis
1:N
Quelle PTF 1:0
Implementierung für Aufgabe 3
Polymorphic Table Functions in 18c: Einführung und Beispiele27 20.11.2018
…
FUNCTION describe (tab IN OUT dbms_tf.table_t, cols2stay IN dbms_tf.columns_t )
RETURN dbms_tf.describe_t IS
BEGIN
FOR I IN 1 .. tab.COLUMN.COUNT LOOP
IF NOT tab.COLUMN(i).description.name MEMBER OF cols2stay THEN
tab.column(i).pass_through := false;
tab.column(i).for_read := true;
END IF;
END LOOP;
RETURN dbms_tf.describe_t(new_columns =>
dbms_tf.columns_new_t( 1 => dbms_tf.column_metadata_t(
name => 'KEY_NAME', TYPE => dbms_tf.type_varchar2),
2 => dbms_tf.column_metadata_t(
name => 'KEY_VALUE', TYPE => dbms_tf.type_varchar2)),
row_replication => true);
END;
…
Row-Repliaction Flag setzen,
sonst ORA-62574
Implementierung für Aufgabe 3 - FETCH_ROWS
Polymorphic Table Functions in 18c: Einführung und Beispiele28 20.11.2018
…
PROCEDURE fetch_rows IS
rowset dbms_tf.row_set_t;
repfac dbms_tf.tab_naturaln_t;
rowcnt PLS_INTEGER;
colcnt PLS_INTEGER;
name_col dbms_tf.tab_varchar2_t;
val_col dbms_tf.tab_varchar2_t;
env dbms_tf.env_t := dbms_tf.get_env();
BEGIN
dbms_tf.get_row_set(rowset, rowcnt, colcnt);
FOR i IN 1 .. rowcnt LOOP
repfac(i) := 0;
END LOOP;
...
Collections für die
neuen Spalten
Environment-
Informationen
Implementierung für Aufgabe 3 - FETCH_ROWS
Polymorphic Table Functions in 18c: Einführung und Beispiele29 20.11.2018
...
FOR r IN 1..rowcnt LOOP
FOR c IN 1..colcnt LOOP
repfac(r) := repfac(r) + 1;
name_col(nvl(name_col.last+1,1)) :=
INITCAP( regexp_replace(env.get_columns(c).name, '^"|"$'));
val_col(nvl(val_col.last+1,1)) := DBMS_TF.COL_TO_CHAR(rowset(c), r);
END LOOP;
END LOOP;
dbms_tf.row_replication(replication_factor => repfac);
dbms_tf.put_col(1, name_col);
dbms_tf.put_col(2, val_col);
END;
…
Für jede zu transponierende Spalte den
Datensatz duplizieren
Replikation setzen
TAB2KEYVAL
Polymorphic Table Functions in 18c: Einführung und Beispiele30 20.11.2018
SQL> SELECT * FROM tab2keyval(t, COLUMNS(A,B));
A B KEY_NAME KEY_VALUE
---------- ---------- ---------- --------------------
1 2 C 3
1 2 V "ONE"
4 5 C 6
4 5 V "TWO"
7 8 C 9
7 8 V "THREE"
SQL> SELECT * FROM tab2keyval(scott.emp, COLUMNS(empno));
EMPNO KEY_NAME KEY_VALUE
---------- ---------- --------------------
7369 Ename "SMITH"
7369 Job "CLERK"
7369 Mgr 7902
7369 Hiredate "17-DEC-80"
7369 Sal 800
...
Aufgabe 4: Gesamtlänge der CSV-Darstellung
Polymorphic Table Functions in 18c: Einführung und Beispiele31 20.11.2018
Basierend auf der Aufgabe 1 die Längen der CSV-Darstellung über die gesamte
Tabelle bzw. eine Partition berechnen
Table Semantic PTF!
Ausführung FETCH_ROWS
Polymorphic Table Functions in 18c: Einführung und Beispiele32 20.11.2018
FETCH_ROWS wird 0 bis N Mal aufgerufen
Datensätze werden in Rowsets verarbeitet
Die Größe des Rowsets wird zur Laufzeit errechnet (<= 1024)
Kann auch parallel ausgeführt werden
– Row Semantics kann von der DB beliebig parallelisiert werden
– Table Semantics: Parallelisierung auf der Basis der PARTITION BY-Klausel
Der Entwickler arbeitet immer mit „aktivem“ Rowset
Die benötigten Zwischenergebnisse können in Execution Store (XSTORE) abgelegt
werden.
Implementierung für Aufgabe 4
Polymorphic Table Functions in 18c: Einführung und Beispiele33 20.11.2018
…
FUNCTION describe (tab IN OUT dbms_tf.table_t, cols2sum IN dbms_tf.columns_t )
RETURN dbms_tf.describe_t IS
BEGIN
FOR I IN 1 .. tab.COLUMN.COUNT LOOP
IF tab.COLUMN(i).description.name MEMBER OF cols2sum THEN
tab.column(i).for_read := true;
END IF;
END LOOP;
RETURN dbms_tf.describe_t(
new_columns => dbms_tf.columns_new_t(
1 => dbms_tf.column_metadata_t(
name => 'LEN', TYPE => dbms_tf.type_number),
3 => dbms_tf.column_metadata_t(
name => 'SUM_LEN', TYPE => dbms_tf.type_number)));
END;
…
Implementierung für Aufgabe 4
Polymorphic Table Functions in 18c: Einführung und Beispiele34 20.11.2018
PROCEDURE fetch_rows IS
...
len_col dbms_tf.tab_number_t;
len_curr_col dbms_tf.tab_number_t;
v_len pls_integer;
v_currlen pls_integer := 0;
BEGIN
dbms_tf.get_row_set(rowset, rowcnt, colcnt);
dbms_tf.xstore_get('len', v_len);
v_currlen := nvl(v_len, 0);
FOR r IN 1..rowcnt LOOP
len_col(r) := length (rowset(1).tab_varchar2(r));
v_currlen := v_currlen + len_col(r);
len_curr_col(r) := v_currlen ;
END LOOP;
dbms_tf.xstore_set('len', v_len+v_currlen);
dbms_tf.put_col(1, len_col);
dbms_tf.put_col(2, len_curr_col);
END;
…
Das Zwischenergebnis aus dem
Execution-Store auslesen
Das Zwischenergebnis im
Execution-Store speichern
SUMLEN_PTF
Polymorphic Table Functions in 18c: Einführung und Beispiele35 20.11.2018
SQL> select * from sumlen_ptf(my_ptf(scott.emp, COLUMNS(deptno)), columns(agg_col));
ORA-62569: nested polymorphic table function is disallowed
SQL> with agg as (SELECT * FROM my_ptf(scott.emp, COLUMNS(deptno)))
2 select * from sumlen_ptf(agg partition by deptno, columns(agg_col));
DEPTNO AGG_COL LEN SUM_LEN
---------- -------------------------------------------------- ---------- ----------
10 7782;"CLARK";"MANAGER";7839;"09-JUN-81";2450; 45 45
10 7839;"KING";"PRESIDENT";;"17-NOV-81";5000; 42 87
10 7934;"MILLER";"CLERK";7782;"23-JAN-82";1300; 44 131
20 7566;"JONES";"MANAGER";7839;"02-APR-81";2975; 45 45
20 7902;"FORD";"ANALYST";7566;"03-DEC-81";3000; 44 89
20 7876;"ADAMS";"CLERK";7788;"23-MAY-87";1100; 43 132
20 7369;"SMITH";"CLERK";7902;"17-DEC-80";800; 42 174
20 7788;"SCOTT";"ANALYST";7566;"19-APR-87";3000; 45 219
30 7521;"WARD";"SALESMAN";7698;"22-FEB-81";1250;500 48 48
30 7844;"TURNER";"SALESMAN";7698;"08-SEP-81";1500;0 48 96
30 7499;"ALLEN";"SALESMAN";7698;"20-FEB-81";1600;300 49 145
30 7900;"JAMES";"CLERK";7698;"03-DEC-81";950; 42 187
30 7698;"BLAKE";"MANAGER";7839;"01-MAY-81";2850; 45 232
30 7654;"MARTIN";"SALESMAN";7698;"28-SEP-81";1250;140 51 283
...
Input partitioniert
Predicate Pushdown
Polymorphic Table Functions in 18c: Einführung und Beispiele36 20.11.2018
Wenn semantisch möglich, werden Prädikate, Projektionen, Partitionen bis in die
unterliegende Tabelle weitergereicht
Nur möglich mit PASS_THROUGH und PARTITION BY Spalten
SELECT * FROM my_ptf(scott.emp, COLUMNS(deptno)) WHERE deptno = 10
---------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 2 (100)| |
| 1 | POLYMORPHIC TABLE FUNCTION | MY_PTF | 3 | 261 | | |
| 2 | TABLE ACCESS BY INDEX ROWID BATCHED| EMP | 3 | 114 | 2 (0)| 00:00:01 |
|* 3 | INDEX RANGE SCAN | SCOTT_DEPTNO_IDX | 3 | | 1 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("EMP"."DEPTNO"=10)
TOPNPLUS
Polymorphic Table Functions in 18c: Einführung und Beispiele37 20.11.2018
In einer Abfrage die Top-N Datensätze ausgeben, den Rest aggregiert darstellen
In 18.3 noch nicht 100% sauber umsetzbar
SQL> SELECT deptno, empno, ename, job, sal
2 FROM topnplus(scott.emp partition by deptno order by sal desc, COLUMNS(sal), columns(deptno), 2)
DEPTNO EMPNO ENAME JOB SAL
---------- ---------- ---------- ---------- ----------
10 7839 KING PRESIDENT 5000
10 7782 CLARK MANAGER 2450
10 1300
20 7788 SCOTT ANALYST 3000
20 7902 FORD ANALYST 3000
20 4875
30 7698 BLAKE MANAGER 2850
30 7499 ALLEN SALESMAN 1600
30 4950
Fazit
Polymorphic Table Functions in 18c: Einführung und Beispiele38 20.11.2018
Mächtige und flexible Erweiterung für SQL
Klar definierte Schnittstelle zur DB lässt den Entwickler seinen Job machen: mehr
Geschäftslogik, weniger technische Details
Performance Optimierungen von Anfang an
ANSI SQL aber noch nicht alle PTF-Features aus ANSI SQL 2016 umgesetzt
Noch kein Support für das Hinzufügen neuer Rows
Echte Aggregatfunktionen noch nicht 100% möglich
Zum Teil noch widersprüchliche Dokumentation
Test it!
Polymorphic Table Functions in 18c: Einführung und Beispiele39 20.11.2018
http://blog.sqlora.com/en/tag/ptf/
http://standards.iso.org/ittf/PubliclyAvailableStandards/c069776_ISO_IEC_TR_19075-
7_2017.zip - document on PTF (ISO/IEC TR 19075-7:2017)
Trivadis @ DOAG 2018
#opencompany
Booth: 3rd Floor – next to the escalator
We share our Know how!
Just come across, Live-Presentations
and documents archive
T-Shirts, Contest and much more
We look forward to your visit
20.11.2018 Polymorphic Table Functions in 18c: Einführung und Beispiele40

Weitere ähnliche Inhalte

Ähnlich wie Polymorphic Table Functions in 18c

Datentransfer mit Oracle Tools
Datentransfer mit Oracle ToolsDatentransfer mit Oracle Tools
Datentransfer mit Oracle ToolsChristian Gohmann
 
Jpgraph - eine Einführung
Jpgraph - eine EinführungJpgraph - eine Einführung
Jpgraph - eine Einführungfrankstaude
 
TYPO3 CMS 7.3 - Die Neuerungen - pluswerk
TYPO3 CMS 7.3 - Die Neuerungen - pluswerkTYPO3 CMS 7.3 - Die Neuerungen - pluswerk
TYPO3 CMS 7.3 - Die Neuerungen - pluswerkdie.agilen GmbH
 
Ausgewählte PL/SQL Packages (2)
Ausgewählte PL/SQL Packages (2)Ausgewählte PL/SQL Packages (2)
Ausgewählte PL/SQL Packages (2)Ulrike Schwinn
 
FCE ohne TemplaVoila
FCE ohne TemplaVoilaFCE ohne TemplaVoila
FCE ohne TemplaVoilaTobias Liegl
 
Überblick: 18c und Autonomous Data Warehouse Cloud (ADWC)
Überblick: 18c und Autonomous Data Warehouse Cloud (ADWC)Überblick: 18c und Autonomous Data Warehouse Cloud (ADWC)
Überblick: 18c und Autonomous Data Warehouse Cloud (ADWC)Ulrike Schwinn
 
Webinar ABAP 7.40 sp5/sp8 Releaseinformationen
Webinar ABAP 7.40 sp5/sp8 ReleaseinformationenWebinar ABAP 7.40 sp5/sp8 Releaseinformationen
Webinar ABAP 7.40 sp5/sp8 ReleaseinformationenCadaxo GmbH
 
18c: private temporary tables
18c: private temporary tables18c: private temporary tables
18c: private temporary tablesUlrike Schwinn
 
JdbcTemplate aus Spring
JdbcTemplate aus SpringJdbcTemplate aus Spring
JdbcTemplate aus Springtutego
 
Dynamische Websites mit XML
Dynamische Websites mit XMLDynamische Websites mit XML
Dynamische Websites mit XMLStephan Schmidt
 
Leichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Leichtgewichtige Architekturen mit Spring, JPA, Maven und GroovyLeichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Leichtgewichtige Architekturen mit Spring, JPA, Maven und GroovyThorsten Kamann
 
TYPO3 CMS 8.1 - Die Neuerungen - pluswerk
TYPO3 CMS 8.1 - Die Neuerungen - pluswerkTYPO3 CMS 8.1 - Die Neuerungen - pluswerk
TYPO3 CMS 8.1 - Die Neuerungen - pluswerkdie.agilen GmbH
 
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins Christian Kauhaus
 
TYPO3 CMS 8.4 - Die Neuerungen - pluswerk
TYPO3 CMS 8.4 - Die Neuerungen - pluswerkTYPO3 CMS 8.4 - Die Neuerungen - pluswerk
TYPO3 CMS 8.4 - Die Neuerungen - pluswerkdie.agilen GmbH
 
Extreme Fluid - Status Quo der modernen Templating Engine
Extreme Fluid - Status Quo der modernen Templating EngineExtreme Fluid - Status Quo der modernen Templating Engine
Extreme Fluid - Status Quo der modernen Templating Enginedie.agilen GmbH
 
Norbert Rieger – IT-Tage 2015 – Optimierung der Performance bei Oracle-Datenb...
Norbert Rieger – IT-Tage 2015 – Optimierung der Performance bei Oracle-Datenb...Norbert Rieger – IT-Tage 2015 – Optimierung der Performance bei Oracle-Datenb...
Norbert Rieger – IT-Tage 2015 – Optimierung der Performance bei Oracle-Datenb...Informatik Aktuell
 

Ähnlich wie Polymorphic Table Functions in 18c (20)

Datentransfer mit Oracle Tools
Datentransfer mit Oracle ToolsDatentransfer mit Oracle Tools
Datentransfer mit Oracle Tools
 
Jpgraph - eine Einführung
Jpgraph - eine EinführungJpgraph - eine Einführung
Jpgraph - eine Einführung
 
01 sqlplus
01 sqlplus01 sqlplus
01 sqlplus
 
TYPO3 CMS 7.3 - Die Neuerungen - pluswerk
TYPO3 CMS 7.3 - Die Neuerungen - pluswerkTYPO3 CMS 7.3 - Die Neuerungen - pluswerk
TYPO3 CMS 7.3 - Die Neuerungen - pluswerk
 
Ausgewählte PL/SQL Packages (2)
Ausgewählte PL/SQL Packages (2)Ausgewählte PL/SQL Packages (2)
Ausgewählte PL/SQL Packages (2)
 
FCE ohne TemplaVoila
FCE ohne TemplaVoilaFCE ohne TemplaVoila
FCE ohne TemplaVoila
 
Überblick: 18c und Autonomous Data Warehouse Cloud (ADWC)
Überblick: 18c und Autonomous Data Warehouse Cloud (ADWC)Überblick: 18c und Autonomous Data Warehouse Cloud (ADWC)
Überblick: 18c und Autonomous Data Warehouse Cloud (ADWC)
 
Webinar ABAP 7.40 sp5/sp8 Releaseinformationen
Webinar ABAP 7.40 sp5/sp8 ReleaseinformationenWebinar ABAP 7.40 sp5/sp8 Releaseinformationen
Webinar ABAP 7.40 sp5/sp8 Releaseinformationen
 
18c: private temporary tables
18c: private temporary tables18c: private temporary tables
18c: private temporary tables
 
JdbcTemplate aus Spring
JdbcTemplate aus SpringJdbcTemplate aus Spring
JdbcTemplate aus Spring
 
Dynamische Websites mit XML
Dynamische Websites mit XMLDynamische Websites mit XML
Dynamische Websites mit XML
 
Leichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Leichtgewichtige Architekturen mit Spring, JPA, Maven und GroovyLeichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
Leichtgewichtige Architekturen mit Spring, JPA, Maven und Groovy
 
Neuerungen SAP PM 2018 DSAG
Neuerungen SAP PM 2018 DSAGNeuerungen SAP PM 2018 DSAG
Neuerungen SAP PM 2018 DSAG
 
TYPO3 CMS 8.1 - Die Neuerungen - pluswerk
TYPO3 CMS 8.1 - Die Neuerungen - pluswerkTYPO3 CMS 8.1 - Die Neuerungen - pluswerk
TYPO3 CMS 8.1 - Die Neuerungen - pluswerk
 
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins
nagiosplugin - eine Python-Biblioth­ek für Monitoring-Plug­ins
 
TYPO3 CMS 8.4 - Die Neuerungen - pluswerk
TYPO3 CMS 8.4 - Die Neuerungen - pluswerkTYPO3 CMS 8.4 - Die Neuerungen - pluswerk
TYPO3 CMS 8.4 - Die Neuerungen - pluswerk
 
Extreme Fluid - Status Quo der modernen Templating Engine
Extreme Fluid - Status Quo der modernen Templating EngineExtreme Fluid - Status Quo der modernen Templating Engine
Extreme Fluid - Status Quo der modernen Templating Engine
 
Explain explain
Explain explainExplain explain
Explain explain
 
Typescript
TypescriptTypescript
Typescript
 
Norbert Rieger – IT-Tage 2015 – Optimierung der Performance bei Oracle-Datenb...
Norbert Rieger – IT-Tage 2015 – Optimierung der Performance bei Oracle-Datenb...Norbert Rieger – IT-Tage 2015 – Optimierung der Performance bei Oracle-Datenb...
Norbert Rieger – IT-Tage 2015 – Optimierung der Performance bei Oracle-Datenb...
 

Mehr von Andrej Pashchenko

MERGE SQL Statement: Lesser Known Facets
MERGE SQL Statement: Lesser Known FacetsMERGE SQL Statement: Lesser Known Facets
MERGE SQL Statement: Lesser Known FacetsAndrej Pashchenko
 
SQL Macros - Game Changing Feature for SQL Developers?
SQL Macros - Game Changing Feature for SQL Developers?SQL Macros - Game Changing Feature for SQL Developers?
SQL Macros - Game Changing Feature for SQL Developers?Andrej Pashchenko
 
Polymorphic Table Functions in 18c
Polymorphic Table Functions in 18cPolymorphic Table Functions in 18c
Polymorphic Table Functions in 18cAndrej Pashchenko
 
Properly Use Parallel DML for ETL
Properly Use Parallel DML for ETLProperly Use Parallel DML for ETL
Properly Use Parallel DML for ETLAndrej Pashchenko
 
Online Statistics Gathering for ETL
Online Statistics Gathering for ETLOnline Statistics Gathering for ETL
Online Statistics Gathering for ETLAndrej Pashchenko
 
SQL Pattern Matching – should I start using it?
SQL Pattern Matching – should I start using it?SQL Pattern Matching – should I start using it?
SQL Pattern Matching – should I start using it?Andrej Pashchenko
 
An unconventional approach for ETL of historized data
An unconventional approach for ETL of historized dataAn unconventional approach for ETL of historized data
An unconventional approach for ETL of historized dataAndrej Pashchenko
 

Mehr von Andrej Pashchenko (7)

MERGE SQL Statement: Lesser Known Facets
MERGE SQL Statement: Lesser Known FacetsMERGE SQL Statement: Lesser Known Facets
MERGE SQL Statement: Lesser Known Facets
 
SQL Macros - Game Changing Feature for SQL Developers?
SQL Macros - Game Changing Feature for SQL Developers?SQL Macros - Game Changing Feature for SQL Developers?
SQL Macros - Game Changing Feature for SQL Developers?
 
Polymorphic Table Functions in 18c
Polymorphic Table Functions in 18cPolymorphic Table Functions in 18c
Polymorphic Table Functions in 18c
 
Properly Use Parallel DML for ETL
Properly Use Parallel DML for ETLProperly Use Parallel DML for ETL
Properly Use Parallel DML for ETL
 
Online Statistics Gathering for ETL
Online Statistics Gathering for ETLOnline Statistics Gathering for ETL
Online Statistics Gathering for ETL
 
SQL Pattern Matching – should I start using it?
SQL Pattern Matching – should I start using it?SQL Pattern Matching – should I start using it?
SQL Pattern Matching – should I start using it?
 
An unconventional approach for ETL of historized data
An unconventional approach for ETL of historized dataAn unconventional approach for ETL of historized data
An unconventional approach for ETL of historized data
 

Polymorphic Table Functions in 18c

  • 1. Polymorphic Table Functions in 18c Andrej Pashchenko @Andrej_SQL doag2018
  • 2. Wir helfen Mehrwerte aus Daten zu generieren Polymorphic Table Functions in 18c: Einführung und Beispiele2 20.11.2018
  • 3. Mit über 650 IT- und Fachexperten bei Ihnen vor Ort. Polymorphic Table Functions in 18c: Einführung und Beispiele3 20.11.2018 16 Trivadis Niederlassungen mit über 650 Mitarbeitenden. Erfahrung aus mehr als 1'900 Projekten pro Jahr bei über 800 Kunden. Über 250 Service Level Agreements. Mehr als 4'000 Trainingsteilnehmer. Forschungs- und Entwicklungsbudget: CHF 5.0 Mio. / EUR 4.0 Mio. Finanziell unabhängig und nachhaltig profitabel.
  • 4. Über mich Polymorphic Table Functions in 18c: Einführung und Beispiele4 20.11.2018 Senior Consultant bei der Trivadis GmbH, Düsseldorf Schwerpunkt Oracle – Data Warehousing – Application Development – Application Performance Kurs-Referent „Oracle 12c New Features für Entwickler“ und „Beyond SQL and PL/SQL“ Blog: http://blog.sqlora.com
  • 5. Tabellenfunktionen vor 18c Polymorphic Table Functions in 18c: Einführung und Beispiele6 20.11.2018 Tabellenfunktionen schon länger bekannt (8i) Der Collection Typ der Rückgabe muss vorher deklariert werden Das Weiterleiten des Datenstroms in die Funktion in einer SQL-Abfrage ist nicht trivial (CURSOR-Parameter) Eigene Aggregatfunktionen mit Oracle Data Cartridge Interface (ODCI) CREATE OR REPLACE TYPE names_t IS TABLE OF VARCHAR2 (100); SELECT t.* FROM TABLE(get_emp_names()) t; SMITH ALLEN WARD JONES
  • 6. Polymorphe Tabellenfunktionen (PTF) Polymorphic Table Functions in 18c: Einführung und Beispiele7 20.11.2018 Evolution von Tabellenfunktionen: Teil von ANSI SQL2016 Komplizierte Geschäftslogik abstrahieren und generisch auf SQL-Ebene zur Verfügung zu stellen SELECT aus der Funktion in der FROM-Klausel Wie eine View, nur prozeduraler und dynamischer (ohne dynamisches SQL) Polymorph: eine PTF unterstützt unterschiedliche Eingabe- und Ausgabe- Datenstrukturen: – Kann generische Tabellenparameter akzeptieren, deren Datensatzstruktur bei der Definition nicht bekannt sein muss. Oracle: genau ein Tabellenparameter ist Pflicht in 18c – Der Rückgabe-Tabellentyp muss nicht bei der Definition deklariert sein, hängt von der Eingabestruktur und zusätzlichen Funktionsparametren ab
  • 7. Polymorphe Tabellenfunktionen (PTF) Polymorphic Table Functions in 18c: Einführung und Beispiele8 20.11.2018 Rollen: – PTF-Entwickler implementiert den prozeduralen Mechanismus für die Lösung der Anforderungen an die PTF und veröffentlicht die Schnittstelle – Abfragen-Entwickler ruft die PTF in der SQL-Abfrage auf – DBMS ist für Kompilierung (Parsing), Ausführung von SQL zuständig und übernimmt viele technische Aspekte: parallele Ausführung, Datenübergabe in die / aus der Funktion, Zustandsverwaltung, etc. Oracle stellt dem PTF-Entwickler die Infrastruktur im Package DBMS_TF sowie einen neuen SQL-Operator COLUMNS() zur Verfügung PTF-Entwickler kann sich auf der fachlichen Aufgabe konzentrieren.
  • 8. Polymorphe Tabellenfunktionen (PTF) Polymorphic Table Functions in 18c: Einführung und Beispiele9 20.11.2018 A B C - - - - - - - - - - - - C1 C2 C3 - - - - - - - - - - - - A B D - - - - - - - - - - - - - - - Polymorphic Table Function add/remove rows, add/remove columns Not allowed! Table T MY_PTF( ) SELECT a,b,d FROM MY_PTF(t);
  • 9. Beispielaufgabe für die erste PTF Polymorphic Table Functions in 18c: Einführung und Beispiele10 20.11.2018 Nur eine definierte Liste der Spalten der Quelltabelle in der Ausgabe behalten. Die restlichen (versteckten) Spalten mit einem Trennzeichen zusammenfügen und als neue Spalte darstellen MY_PTF SELECT a,b,d FROM MY_PTF(t, COLUMNS(a,b));
  • 10. Passt zur Beispielaufgabe Typen von PTF Polymorphic Table Functions in 18c: Einführung und Beispiele11 20.11.2018 Jeder Ergebnis-Datensatz kann ausschließlich aus dem laufenden Quell-Datensatz abgeleitet werden Anwendungsbeispiele: – Hinzufügen neuer berechneter Spalten – Umformatieren des Datensatzes – Ausgabe in einem speziellen Format (JSON, CSV, etc.) – Replikation – Pivot / Transponieren Das Ergebnis-Datensatz ergibt sich aus der Betrachtung vom laufenden Quell- Datensatz und bereits verarbeiteten Datensätze Arbeitet auf der ganzen Tabelle bzw. einer (logischen) Partition davon Input-Tabelle kann optional partitioniert und sortiert werden Anwendungsbeispiele: – Benutzerdefinierte Aggregat- / Fensterfunktionen PTF Row-Semantic Table-Semantic
  • 11. Interface-Methoden Polymorphic Table Functions in 18c: Einführung und Beispiele12 20.11.2018 Jede PTF braucht ein Implementierungs-Package, das die Implementierung der Interface-Methoden bereitstellt: DESCRIBE OPEN FETCH_ROWS CLOSE Kompilierungsphase Ausführungsphase Beschreibt das Format der Ergebnis-Tabelle Setup Quell-Datensätze verarbeiten und Ergebnis produzieren Cleanup Pflicht! optional optional optional
  • 12. Definition: Package und PTF Polymorphic Table Functions in 18c: Einführung und Beispiele13 20.11.2018 CREATE OR REPLACE PACKAGE my_ptf_package AS FUNCTION describe (tab IN OUT dbms_tf.table_t, cols2stay IN dbms_tf.columns_t ) RETURN dbms_tf.describe_t; PROCEDURE fetch_rows; -- Not required for now --PROCEDURE open; --PROCEDURE close; END my_ptf_package; / CREATE OR REPLACE FUNCTION my_ptf (tab TABLE, cols2stay COLUMNS ) RETURN TABLE PIPELINED ROW POLYMORPHIC USING my_ptf_package; Spaltenliste: diese Spalten wollen wir beibehalten
  • 13. DESCRIBE Polymorphic Table Functions in 18c: Einführung und Beispiele14 20.11.2018 die Methode wird beim Parsen von SQL von der DB aufgerufen, kann nicht explizit aufgerufen werden definiert die Struktur der Rückgabe-Tabelle ausgehend von: – der Struktur der Input-Tabelle – weiteren Parametern die DB wandelt die Tabellen-Metadaten in DBMS_TF.TABLE_T, die evtl. vorhandenen Columns-Parameter – in DBMS_TF.COLUMNS_T um liefert die Metadaten über die neuen Spalten zurück - DBMS_TF.DESCRIBE_T außerdem können die Spalten der Input-Tabelle als „pass-through“ oder „for read“ markiert werden (DBMS_TF.TABLE_T ist ein IN OUT Parameter)
  • 14. PASS-THROUGH und FOR READ Spalten Polymorphic Table Functions in 18c: Einführung und Beispiele15 20.11.2018 A B C D E - - - - - - - - - - - - - - - - - - - - D E F G - - - - - - - - - - - - FOR_READ Table T MY_PTF( ) SELECT * FROM MY_PTF(t);PASS_THROUGH new columns F and G
  • 15. PASS-THROUGH und FOR READ Spalten Polymorphic Table Functions in 18c: Einführung und Beispiele16 20.11.2018 PASS THROUGH Werden ohne Änderung in das Ergebnis weitergeleitet Defaults: – Row Semantic – alle Spalten – Table Semantic – keine Spalten, außer Partitioning-Klausel* FOR READ Nur diese Spalten werden in FETCH_ROWS abrufbar. Default- keine Spalten Beide Eigenschaften schließen sich gegenseitig NICHT aus! Spalten im Parameter COLS2STAY sind PASS_THROUGH, alle anderen FOR_READ * - in 18.1 funktioniert es nicht. Bug?
  • 16. Implementierung DESCRIBE Polymorphic Table Functions in 18c: Einführung und Beispiele17 20.11.2018 … FUNCTION describe (tab IN OUT dbms_tf.table_t, cols2stay IN dbms_tf.columns_t ) RETURN dbms_tf.describe_t IS new_col_name CONSTANT VARCHAR2(30) := 'AGG_COL'; BEGIN FOR I IN 1 .. tab.COLUMN.COUNT LOOP IF NOT tab.COLUMN(i).description.name MEMBER OF cols2stay THEN tab.column(i).pass_through := false; tab.column(i).for_read := true; END IF; END LOOP; RETURN dbms_tf.describe_t( new_columns => dbms_tf.columns_new_t( 1 => dbms_tf.column_metadata_t( name => new_col_name, TYPE => dbms_tf.type_varchar2))); END; … Diese Spalten verstecken und aggregieren Default=true für alle anderen Metadaten für die neue Spalte
  • 17. Implementierung FETCH_ROWS Polymorphic Table Functions in 18c: Einführung und Beispiele18 20.11.2018 Kontext DESCRIBE FOR READ Columns New Columns PASS_THROUGH columns Kontext FETCH_ROWS GET-Columns PUT-Columns Nicht sichtbar in FETCH_ROWS
  • 18. Struktur von ROWSET Polymorphic Table Functions in 18c: Einführung und Beispiele19 20.11.2018
  • 19. Implementierung FETCH_ROWS Polymorphic Table Functions in 18c: Einführung und Beispiele20 20.11.2018 … PROCEDURE fetch_rows IS rowset dbms_tf.row_set_t; colcnt PLS_INTEGER; rowcnt PLS_INTEGER; agg_col dbms_tf.tab_varchar2_t; BEGIN dbms_tf.get_row_set(rowset, rowcnt, colcnt); FOR r IN 1..rowcnt LOOP agg_col(r) := ''; FOR c IN 1..colcnt LOOP agg_col(r) := agg_col(r)||';'||DBMS_TF.COL_TO_CHAR(rowset(c), r); END LOOP; agg_col(r) := ltrim (agg_col(r) ,';'); END LOOP; dbms_tf.put_col(1, agg_col); END; … Read Columns fetchen Aggregation durchführen Daten für die neue Spalte zurückgeben
  • 20. Polymorphismus in der Praxis Polymorphic Table Functions in 18c: Einführung und Beispiele21 20.11.2018 SQL> SELECT * FROM my_ptf(t, COLUMNS(A)); A AGG_COL ---------- -------------------------------------------------- 1 2;3;"ONE" 4 5;6;"TWO" 7 8;9;"THREE" SQL> SELECT * FROM my_ptf(t, COLUMNS(A,B)); A B AGG_COL ---------- ---------- -------------------------------------------------- 1 2 3;"ONE" 4 5 6;"TWO" 7 8 9;"THREE" SQL> SELECT * FROM my_ptf(scott.emp, COLUMNS(empno)); EMPNO AGG_COL ---------- -------------------------------------------------- 7369 "SMITH";"CLERK";7902;"17-DEC-80";800;;20 7499 "ALLEN";"SALESMAN";7698;"20-FEB-81";1600;300;30 7521 "WARD";"SALESMAN";7698;"22-FEB-81";1250;500;30
  • 21. Aufgabe 2 = Aufgabe 1 + JSON-Format Polymorphic Table Functions in 18c: Einführung und Beispiele22 20.11.2018 Nur eine definierte Liste der Spalten der Quelltabelle in der Ausgabe behalten. Die restlichen (versteckten) Spalten als JSON-Dokument ausgeben SPLIT_JSON SELECT a,b, json_col FROM split_json(t, COLUMNS(a,b));
  • 22. Implementierung für Aufgabe 2 Polymorphic Table Functions in 18c: Einführung und Beispiele23 20.11.2018 … FUNCTION describe … PROCEDURE fetch_rows IS rowset dbms_tf.row_set_t; rowcnt PLS_INTEGER; json_col dbms_tf.tab_varchar2_t; BEGIN dbms_tf.get_row_set(rowset, rowcnt); FOR r IN 1..rowcnt LOOP json_col(r) := DBMS_TF.ROW_TO_CHAR(rowset, r, DBMS_TF.FORMAT_JSON); END LOOP; dbms_tf.put_col(1, json_col); END;… DESCRIBE ändert sich nicht… Row Set als JSON ausgeben
  • 23. SPLIT_JSON Polymorphic Table Functions in 18c: Einführung und Beispiele24 20.11.2018 SQL> SELECT * FROM split_json(t, COLUMNS(A)); A JSON_COL ---------- ------------------------------------- 1 {"B":2, "C":3, "V":"ONE"} 4 {"B":5, "C":6, "V":"TWO"} 7 {"B":8, "C":9, "V":"THREE"} SQL> SELECT * FROM split_json(t, COLUMNS(A,B)); A B JSON_COL ---------- ---------- -------------------------- 1 2 {"C":3, "V":"ONE"} 4 5 {"C":6, "V":"TWO"} 7 8 {"C":9, "V":"THREE"} SQL> SELECT * FROM split_json(scott.emp, COLUMNS(empno)); EMPNO JSON_COL ---------- ---------------------------------------------------------------------- 7369 {"ENAME":"SMITH", "JOB":"CLERK", "MGR":7902, "HIREDATE":"17-DEC-80", ... 7499 {"ENAME":"ALLEN", "JOB":"SALESMAN", "MGR":7698, "HIREDATE":"20-FEB-81", ... 7521 {"ENAME":"WARD", "JOB":"SALESMAN", "MGR":7698, "HIREDATE":"22-FEB-81", ...
  • 24. Aufgabe 3: Spalten zu Zeilen transponieren Polymorphic Table Functions in 18c: Einführung und Beispiele25 20.11.2018 Nur eine definierte Liste der Spalten der Quelltabelle zur Identifikation in der Ausgabe behalten. Die restlichen Spalten als Key-Value Paare darstellen MY_PTF SELECT * FROM tab2keyval(t, COLUMNS(a,b)); Mehr Datensätze im Ergebnis als in der Quelle?
  • 25. Row Replication Polymorphic Table Functions in 18c: Einführung und Beispiele26 20.11.2018 Row Replication erlaubt, Datensätze zu multiplizieren oder zu auszublenden DBMS_TF.ROW_REPLICATION als Faktor für alle Datensätze oder auf Datensatz-Basis In DESCRIBE muss ein Flag gesetzt werden, sonst ORA-62574 Im Moment, die einzige Möglichkeit neue Datensätze hinzuzufügen. Aber: PASS_THROUGH Spalten beachten! Quelle PTF Ergebnis 1:1 Quelle PTF Ergebnis Ergebnis Ergebnis 1:N Quelle PTF 1:0
  • 26. Implementierung für Aufgabe 3 Polymorphic Table Functions in 18c: Einführung und Beispiele27 20.11.2018 … FUNCTION describe (tab IN OUT dbms_tf.table_t, cols2stay IN dbms_tf.columns_t ) RETURN dbms_tf.describe_t IS BEGIN FOR I IN 1 .. tab.COLUMN.COUNT LOOP IF NOT tab.COLUMN(i).description.name MEMBER OF cols2stay THEN tab.column(i).pass_through := false; tab.column(i).for_read := true; END IF; END LOOP; RETURN dbms_tf.describe_t(new_columns => dbms_tf.columns_new_t( 1 => dbms_tf.column_metadata_t( name => 'KEY_NAME', TYPE => dbms_tf.type_varchar2), 2 => dbms_tf.column_metadata_t( name => 'KEY_VALUE', TYPE => dbms_tf.type_varchar2)), row_replication => true); END; … Row-Repliaction Flag setzen, sonst ORA-62574
  • 27. Implementierung für Aufgabe 3 - FETCH_ROWS Polymorphic Table Functions in 18c: Einführung und Beispiele28 20.11.2018 … PROCEDURE fetch_rows IS rowset dbms_tf.row_set_t; repfac dbms_tf.tab_naturaln_t; rowcnt PLS_INTEGER; colcnt PLS_INTEGER; name_col dbms_tf.tab_varchar2_t; val_col dbms_tf.tab_varchar2_t; env dbms_tf.env_t := dbms_tf.get_env(); BEGIN dbms_tf.get_row_set(rowset, rowcnt, colcnt); FOR i IN 1 .. rowcnt LOOP repfac(i) := 0; END LOOP; ... Collections für die neuen Spalten Environment- Informationen
  • 28. Implementierung für Aufgabe 3 - FETCH_ROWS Polymorphic Table Functions in 18c: Einführung und Beispiele29 20.11.2018 ... FOR r IN 1..rowcnt LOOP FOR c IN 1..colcnt LOOP repfac(r) := repfac(r) + 1; name_col(nvl(name_col.last+1,1)) := INITCAP( regexp_replace(env.get_columns(c).name, '^"|"$')); val_col(nvl(val_col.last+1,1)) := DBMS_TF.COL_TO_CHAR(rowset(c), r); END LOOP; END LOOP; dbms_tf.row_replication(replication_factor => repfac); dbms_tf.put_col(1, name_col); dbms_tf.put_col(2, val_col); END; … Für jede zu transponierende Spalte den Datensatz duplizieren Replikation setzen
  • 29. TAB2KEYVAL Polymorphic Table Functions in 18c: Einführung und Beispiele30 20.11.2018 SQL> SELECT * FROM tab2keyval(t, COLUMNS(A,B)); A B KEY_NAME KEY_VALUE ---------- ---------- ---------- -------------------- 1 2 C 3 1 2 V "ONE" 4 5 C 6 4 5 V "TWO" 7 8 C 9 7 8 V "THREE" SQL> SELECT * FROM tab2keyval(scott.emp, COLUMNS(empno)); EMPNO KEY_NAME KEY_VALUE ---------- ---------- -------------------- 7369 Ename "SMITH" 7369 Job "CLERK" 7369 Mgr 7902 7369 Hiredate "17-DEC-80" 7369 Sal 800 ...
  • 30. Aufgabe 4: Gesamtlänge der CSV-Darstellung Polymorphic Table Functions in 18c: Einführung und Beispiele31 20.11.2018 Basierend auf der Aufgabe 1 die Längen der CSV-Darstellung über die gesamte Tabelle bzw. eine Partition berechnen Table Semantic PTF!
  • 31. Ausführung FETCH_ROWS Polymorphic Table Functions in 18c: Einführung und Beispiele32 20.11.2018 FETCH_ROWS wird 0 bis N Mal aufgerufen Datensätze werden in Rowsets verarbeitet Die Größe des Rowsets wird zur Laufzeit errechnet (<= 1024) Kann auch parallel ausgeführt werden – Row Semantics kann von der DB beliebig parallelisiert werden – Table Semantics: Parallelisierung auf der Basis der PARTITION BY-Klausel Der Entwickler arbeitet immer mit „aktivem“ Rowset Die benötigten Zwischenergebnisse können in Execution Store (XSTORE) abgelegt werden.
  • 32. Implementierung für Aufgabe 4 Polymorphic Table Functions in 18c: Einführung und Beispiele33 20.11.2018 … FUNCTION describe (tab IN OUT dbms_tf.table_t, cols2sum IN dbms_tf.columns_t ) RETURN dbms_tf.describe_t IS BEGIN FOR I IN 1 .. tab.COLUMN.COUNT LOOP IF tab.COLUMN(i).description.name MEMBER OF cols2sum THEN tab.column(i).for_read := true; END IF; END LOOP; RETURN dbms_tf.describe_t( new_columns => dbms_tf.columns_new_t( 1 => dbms_tf.column_metadata_t( name => 'LEN', TYPE => dbms_tf.type_number), 3 => dbms_tf.column_metadata_t( name => 'SUM_LEN', TYPE => dbms_tf.type_number))); END; …
  • 33. Implementierung für Aufgabe 4 Polymorphic Table Functions in 18c: Einführung und Beispiele34 20.11.2018 PROCEDURE fetch_rows IS ... len_col dbms_tf.tab_number_t; len_curr_col dbms_tf.tab_number_t; v_len pls_integer; v_currlen pls_integer := 0; BEGIN dbms_tf.get_row_set(rowset, rowcnt, colcnt); dbms_tf.xstore_get('len', v_len); v_currlen := nvl(v_len, 0); FOR r IN 1..rowcnt LOOP len_col(r) := length (rowset(1).tab_varchar2(r)); v_currlen := v_currlen + len_col(r); len_curr_col(r) := v_currlen ; END LOOP; dbms_tf.xstore_set('len', v_len+v_currlen); dbms_tf.put_col(1, len_col); dbms_tf.put_col(2, len_curr_col); END; … Das Zwischenergebnis aus dem Execution-Store auslesen Das Zwischenergebnis im Execution-Store speichern
  • 34. SUMLEN_PTF Polymorphic Table Functions in 18c: Einführung und Beispiele35 20.11.2018 SQL> select * from sumlen_ptf(my_ptf(scott.emp, COLUMNS(deptno)), columns(agg_col)); ORA-62569: nested polymorphic table function is disallowed SQL> with agg as (SELECT * FROM my_ptf(scott.emp, COLUMNS(deptno))) 2 select * from sumlen_ptf(agg partition by deptno, columns(agg_col)); DEPTNO AGG_COL LEN SUM_LEN ---------- -------------------------------------------------- ---------- ---------- 10 7782;"CLARK";"MANAGER";7839;"09-JUN-81";2450; 45 45 10 7839;"KING";"PRESIDENT";;"17-NOV-81";5000; 42 87 10 7934;"MILLER";"CLERK";7782;"23-JAN-82";1300; 44 131 20 7566;"JONES";"MANAGER";7839;"02-APR-81";2975; 45 45 20 7902;"FORD";"ANALYST";7566;"03-DEC-81";3000; 44 89 20 7876;"ADAMS";"CLERK";7788;"23-MAY-87";1100; 43 132 20 7369;"SMITH";"CLERK";7902;"17-DEC-80";800; 42 174 20 7788;"SCOTT";"ANALYST";7566;"19-APR-87";3000; 45 219 30 7521;"WARD";"SALESMAN";7698;"22-FEB-81";1250;500 48 48 30 7844;"TURNER";"SALESMAN";7698;"08-SEP-81";1500;0 48 96 30 7499;"ALLEN";"SALESMAN";7698;"20-FEB-81";1600;300 49 145 30 7900;"JAMES";"CLERK";7698;"03-DEC-81";950; 42 187 30 7698;"BLAKE";"MANAGER";7839;"01-MAY-81";2850; 45 232 30 7654;"MARTIN";"SALESMAN";7698;"28-SEP-81";1250;140 51 283 ... Input partitioniert
  • 35. Predicate Pushdown Polymorphic Table Functions in 18c: Einführung und Beispiele36 20.11.2018 Wenn semantisch möglich, werden Prädikate, Projektionen, Partitionen bis in die unterliegende Tabelle weitergereicht Nur möglich mit PASS_THROUGH und PARTITION BY Spalten SELECT * FROM my_ptf(scott.emp, COLUMNS(deptno)) WHERE deptno = 10 --------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 2 (100)| | | 1 | POLYMORPHIC TABLE FUNCTION | MY_PTF | 3 | 261 | | | | 2 | TABLE ACCESS BY INDEX ROWID BATCHED| EMP | 3 | 114 | 2 (0)| 00:00:01 | |* 3 | INDEX RANGE SCAN | SCOTT_DEPTNO_IDX | 3 | | 1 (0)| 00:00:01 | --------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 3 - access("EMP"."DEPTNO"=10)
  • 36. TOPNPLUS Polymorphic Table Functions in 18c: Einführung und Beispiele37 20.11.2018 In einer Abfrage die Top-N Datensätze ausgeben, den Rest aggregiert darstellen In 18.3 noch nicht 100% sauber umsetzbar SQL> SELECT deptno, empno, ename, job, sal 2 FROM topnplus(scott.emp partition by deptno order by sal desc, COLUMNS(sal), columns(deptno), 2) DEPTNO EMPNO ENAME JOB SAL ---------- ---------- ---------- ---------- ---------- 10 7839 KING PRESIDENT 5000 10 7782 CLARK MANAGER 2450 10 1300 20 7788 SCOTT ANALYST 3000 20 7902 FORD ANALYST 3000 20 4875 30 7698 BLAKE MANAGER 2850 30 7499 ALLEN SALESMAN 1600 30 4950
  • 37. Fazit Polymorphic Table Functions in 18c: Einführung und Beispiele38 20.11.2018 Mächtige und flexible Erweiterung für SQL Klar definierte Schnittstelle zur DB lässt den Entwickler seinen Job machen: mehr Geschäftslogik, weniger technische Details Performance Optimierungen von Anfang an ANSI SQL aber noch nicht alle PTF-Features aus ANSI SQL 2016 umgesetzt Noch kein Support für das Hinzufügen neuer Rows Echte Aggregatfunktionen noch nicht 100% möglich Zum Teil noch widersprüchliche Dokumentation Test it!
  • 38. Polymorphic Table Functions in 18c: Einführung und Beispiele39 20.11.2018 http://blog.sqlora.com/en/tag/ptf/ http://standards.iso.org/ittf/PubliclyAvailableStandards/c069776_ISO_IEC_TR_19075- 7_2017.zip - document on PTF (ISO/IEC TR 19075-7:2017)
  • 39. Trivadis @ DOAG 2018 #opencompany Booth: 3rd Floor – next to the escalator We share our Know how! Just come across, Live-Presentations and documents archive T-Shirts, Contest and much more We look forward to your visit 20.11.2018 Polymorphic Table Functions in 18c: Einführung und Beispiele40