Virtabs: synthetische Spalten

"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”.

 

[Konzepte] [Virtab-Prozeduren] [LINK, FOREIGNKEY] [QUERY: Mehrfachzugriffe] [USES und Verschmelzen] [Schreibschutz, -zwang] [Daten-Teilmengen] [Synthetische Spalten] [User-SQL]