get-Routinen inkl. cachen unter PL/SQL

Posted by Sven Thämar

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:

  1. Aufsetzten eines "get"-Package für die jeweiligen Tabellen.
  2. Implementierung einer zentralen "privaten" get-Routine
  3. 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 />&#160;&#160;&#160; FUNCTION get(pi_id warengruppen.wag_id%TYPE)
            RETURN warengruppen.wag_bezeichnung%TYPE IS&#160;&#160;&#160;&#160; CURSOR c_rec IS
      SELECT *
        FROM warengruppen
       WHERE wag_id = pi_id;
 
BEGIN<br />   IF pi_id &lt;&gt; g_id THEN<br />      g_id := pi_id;<br />
      OPEN c_rec;&#160;&#160;&#160; FETCH c_rec INTO g_record;
      CLOSE c_rec;<br />   END IF;&#160;&#160;&#160; RETURN g_record;
END get;
 
FUNCTION get_bezeichnung(pi_id warengruppen.wag_id%TYPE)
         RETURN warengruppen.wag_bezeichnung%TYPE;&#160;&#160;&#160; BEGIN&#160;&#160;&#160;&#160;&#160;&#160; RETURN get(pi_id).wag_bezeichnung;&#160;&#160;&#160; END get_bezeichnung;
 
FUNCTION get_kontonr(pi_id warengruppen.wag_id%TYPE)
         RETURN warengruppen.wag_kontonr%TYPE;&#160;&#160;&#160; BEGIN&#160;&#160;&#160;&#160;&#160; RETURN get(pi_id).wag_kontonr;&#160;&#160;&#160; END get_kontonr;
 
FUNCTION get_status(pi_id warengruppen.wag_id%TYPE)
         RETURN warengruppen.wag_status%TYPE;&#160;&#160;&#160; BEGIN&#160;&#160;&#160;&#160;&#160;&#160; RETURN get(pi_id).wag_status;&#160;&#160;&#160; 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.

Leave a Reply