get-Routinen inkl. cachen unter PL/SQL
Dieser Abschnitt befasst sich mit dem Thema des auslesen von Feldinhalten eines Datensatzes einer Tabelle welcher über eine ID (i.d.R der PK) angesprochen wird.
Die meisten ermitteln den Inhalt einer Spalte ganz Normal über eine Cursor-Programmierung innerhalb einer Funktion. Das bedeutet, dass für jede Spalte, die ermittelt werden soll, eine Funktion geschrieben wird. Dies erzeugt unnötigen Sourcecode.
Ein weiterer Vorteil ist das cachen des Records. Ändert sich die ID nicht, so braucht der Record nicht noch mal via Cursor gelesen werden, sondern kann direkt zurück gegeben werden. Das kann die Performance (> 50%) unter Umständen ziemlich steigern.
Ein effektiverer Weg ist folgender:
- Aufsetzten eines "get"-Package für die jeweiligen Tabellen.
- Implementierung einer zentralen "privaten" get-Routine
- Implementierung der jeweils benötigten "öffentlichen" get-Routinen.
Beispiel:
Tabelle: WARENGRUPPEN
Auszug der Spalten der Tabelle
- wag_id NUMBER(10,0)
- wag_bezeichnung VARCHAR2(100)
- wag_kontonr NUMBER(10,0)
- wag_status NUMBER(1,0)
PACKAGE pgk_wag IS FUNCTION get_bezeichnung(pi_id warengruppen.wag_id%TYPE) RETURN warengruppen.wag_bezeichnung%TYPE;    FUNCTION get_kontonr(pi_id warengruppen.wag_id%TYPE) RETURN warengruppen.wag_kontonr%TYPE;    FUNCTION get_status(pi_id warengruppen.wag_id%TYPE) RETURN warengruppen.wag_status%TYPE; END pkg_wag;
PACKAGE BODY pgk_wag IS
g_id warengruppen.id%TYPE;<br /> g_record warengruppen%ROWTYPE;<br />    FUNCTION get(pi_id warengruppen.wag_id%TYPE) RETURN warengruppen.wag_bezeichnung%TYPE IS     CURSOR c_rec IS SELECT * FROM warengruppen WHERE wag_id = pi_id; BEGIN<br /> IF pi_id <> g_id THEN<br /> g_id := pi_id;<br /> OPEN c_rec;    FETCH c_rec INTO g_record; CLOSE c_rec;<br /> END IF;    RETURN g_record; END get; FUNCTION get_bezeichnung(pi_id warengruppen.wag_id%TYPE) RETURN warengruppen.wag_bezeichnung%TYPE;    BEGIN       RETURN get(pi_id).wag_bezeichnung;    END get_bezeichnung; FUNCTION get_kontonr(pi_id warengruppen.wag_id%TYPE) RETURN warengruppen.wag_kontonr%TYPE;    BEGIN      RETURN get(pi_id).wag_kontonr;    END get_kontonr; FUNCTION get_status(pi_id warengruppen.wag_id%TYPE) RETURN warengruppen.wag_status%TYPE;    BEGIN       RETURN get(pi_id).wag_status;    END get_status;<br /><br /><br /> BEGIN<br /> g_id := -1; -- Initialisierung der Globalen Hilfsvariable <br />END pkg_wag;
Vorteil
Das Package ist schnell erweiterbar und sehr übersichtlich.
Nachteil
Man muss bedenken, dass immer eine Selektion auf alle Spalten des Datensatzes durchgeführt wird. Das kann unter Umständen den Datenbankserver unnötig belasten.
Fazit
Bei kleinen Hilfstabellen, bis ca. 10 Spalten, sollte man diesen Zugriff ruhig benutzen. Letztendlich ließt die Datenbank Blockweise die Daten ein und stellt sie dem Anwender zur Verfügung. Bei größeren Tabellen > 20 Spalten sollte man besser auf die klassische Art der Cursor-Programmierung zurückgreifen.
- April 1st
Leave a Reply