Donnerstag, 30. November 2017

einen Forms Datenblock mit einer Pipelined Table Function erstellen

Heute wurde ich im Daily Standup im aktuellen Projekt gefragt, ob ich oder einer der Kollegen schon mal einen Forms Datenblock mit einer Pipelined Table Function erstellt habe. Dies habe ich abgefragt und verneint. Und vor kurzem tauchte diese Frage auch schon im Oracle Support Forum auf.

Also habe ich das einfach ausprobiert und kann sagen, es funktioniert. Dieses Vorgehen will ich hier einmal exemplarisch beschreiben. Als Datenquelle dient das gute DB-Schema HR mit den Tabellen Employees und Department.

Zuerst erstelle ich auf der Datenbank ein Package mit einer Pipelined Table Function.


Nach dem Erstellen schaue ich mir einmal das Ergebnis als SQL im SQLDeveloper an für Department 50.


Das funktioniert ja bisher alles ohne Probleme, das Erstellen einer einfachen Forms-Maske dafür ist auch nicht schwer. Erst erstelle ich mir mit dem Wizard basierend auf einer View den Datenblock und das Layout und nachher schalte ich das Ganze auf die Pipelined Table Function in einer Select-From Query um.


Am Ende dann die fertige Maske, die übrigens mit Forms 10g erstell wurde. Es geht also recht einfach, auch neue Features der Datenbank in Forms zu nutzen.


Übrigens kann ich das o.g. Package nicht in Forms erstellen, es muß auf der Datenbank sein. Auch in Forms 12c geht das nicht, da wird die Pipelined Table Function noch nicht von der Engine verstanden. Aber das gehört ja auch eher als API in die Datenbank finde ich.

Ob ich den konstanten Parameter 50 auch noch auf ein referenziertes Item beispielsweise eines anderen Forms-Blocks umbauen kann, habe ich noch nicht probiert. Es scheint aber nicht zu funktionieren, siehe Thread im Forum.

Dort wird als Lösung die Nutzung einer Package-Variable bzw. eines Sys-Kontextes vorgeschlagen:
AND d.deptno = SYS_CONTEXT ('from_clause_context', 'deptno')

Was aber auch geht, ist die Benutzung fester Werte mit Variablen in der Zuweisung.

asQuery_V := 'TABLE(Package.TableFunction('||Variable_1_V||',' ||Variable_2_V||'))';
set_block_property('BLOCK', QUERY_DATA_SOURCE_NAME, asQuery_V);

Viele Grüße
Holger

1 Kommentar: