"Synthetische" Virtabspalten.
Synthetische Virtabspalten stellen nicht mehr die
unterliegende Tabellendaten direkt dar, sondern rufen
stattdessen eine beliebige Funktion zur Darstellung der
Spalte in der View und beliebige Proceduren in den
INSERT/UPDATE/DELETE-Virtab-Proceduren auf. Dadurch ist das
Schreib/Leseverhalten einer Virtabspalte frei programmierbar.
Syntax:
Erinnerung: Die Verwendung von Zugriffsprozeduren für
synthetische Spalten wird so definiert (siehe Syntax):
COLUMN vtcolname [= tablealias.basetable_column]
[ONINSERT [package.]insprocname] [ONUPDATE [package.]updprocname]
[ONDELETE [package.]delprocname] ONGET [package.]getfuncname
Definition der Zugriffsprozeduren
Mit synthetischen Spalten können Funktionalitäten
programmiert werden können, die keinen Bezug mehr zu einer
bestimmten Basistabelle haben. Trotzdem werden sie mit einer
bestimmten Spalte der Basistabelle “tablealias” assoziert. An
die Prozeduren wird der Primärschlüssel des lokalisierten
Records dieser Tabelle übergeben, dieser stellt den
Aufruf-Kontext der Prozedur dar.
An die function “getfuncname” wird als einziger Parameter
der Primärschlüssel des Records von “tablealias” übergeben.
Der Rückgabe
Die drei stored procedures "insprocname",
“udpateprocname” und."delprocname" müssen folgende
Definition haben:
1. Parameter = Primärschlüssel der 'dbtable' der Virtabspalte
2. Parameter = virtabspalte 'vtcolname'
Die Prozeduren werden nach dem regulären INSERT/UPDATE bzw.
vor dem DELETE auf der Table ausgeführt.
Beispiel für eine „get-proc“, die nur die Originaldaten
einer Spalte unverarbeitet zurückliefert (Am Beispiel
"Einzelwerte" aus "ECO1"):
CREATE OR REPLACE FUNCTION get_wert(p_w_id number) RETURN VARCHAR2
IS result VARCHAR2(40) ; BEGIN
SELECT wert INTO result FROM werte WHERE w_id = p_w_id;
RETURN result ; END ;
|
Vergleich mit CALCULATES
Das Konzept der „ONGET-Function“ überschneidet sich stark mit dem Konzept der
„CALCULATED“-Column. Trotzdem bestehen folgende Unterschiede zwischen dem
CALCULATES-Schlüsselwort und der ONGET-Funktion:
-
ONGET erfordert, dass die Spalte in einer Tabelle real gespeichert wird.
-
ONGET übergibt automatisch den PK des Tabellendatensatzes (der für
CALCULATES vielleicht nicht zur Verfügung steht)
-
ONGET steht typischerweise in einem Package zusammen mit ONINSERT,
ONUPDATE,.ONDELETE-Prozeduren und bildet mit diesen eine Funktionseinheit.
-
CALCULATES kann ebenfalls Prozeduren aufrufen, ist also mächtiger.
-
CALCULATES kann Ausdrücke direkt in die View einbetten, ist also möglicherweise
performanter.
Warum der Bezug auf eine Basistabellen-Spalte?
Der Zwang, für synthetische Virtab-Spalte immer eine echte DB-Spalte anzugeben (was
eigentlich nicht unmittelbar einsichtig ist), ergibt sich aus dem Problem, den Zugriffsprozeduren
den Kontext der Datenlage mitzuteilen: Dazu wird den Prozeduren der PK-Wert für die
anzusprechende Spalte in der DBTable übergeben. Dieser PK bezeichnet also den Datensatz
in der DB-Tabelle, für den die Spalten-Funktionen bzw. -Proceduren ihre Umrechnungen
vornehmen. So wird der Prozedur mitgeteilt, in welcher Situation sie aufgerufen wird, und
welchen Datenbestand sie bearbeiten soll.
Daher der Zwang:
Jeder synthetischen Virtabspalte muss eine echte Tabellenspalte zugrundeliegen.
Beispiel für eine Virtab mit synthetischen Spalten
Die Definition einer View aus ECO, in der die Spalte WERT datenabhängig direkt angezeigt
bzw. aus DTE_LIST gewonnen wird, sieht dann folgendermaßen aus:
CREATE VIRTUALTABLE einzelwerte
... TABLE dowerterahmen
TABLE werte
TABLE datentypenelemente OPTIONAL ...
COLUMN wert_zeitvon = dowerterahmen.zeitvon
COLUMN wert_zeitbis = dowerterahmen.zeitbis
COLUMN w_id = werte.w_id
COLUMN w_anz = werte.w_anz
...
COLUMN wert = werte.wert ONINSERT insert_wert
ONUPDATE update_wert ONDELETE delete_wert ONGET get_wert
Die synthetische Spalte „wert“ wird dabei komplett durch die Prozeduren “insert_wert”, ....”delete_wert” und die Funktion “get_wert gekapselt”.
|