SELECT-INTO

Die SQL-SELECT-Anweisung wird als PL/SQL-Anweisung vollständig übernommen uneingeschränkt mit aller Syntax und Ausdruckskraft. Sie wird lediglich um eine Klausel noch erweitert und zwar um die INTO-Klausel, damit PL/SQL-Variablen bzw. eine PL/SQL-RECORD-Variable? angegeben werden können in die Werte des Ergebnisdatensatzes der SELECT-Anweisung eingefügt werden können und anschließend dem PL/SQL-Programm zur weiteren Verarbeitung zur Verfügung stehen.

Bei der Ausführung weist die SELECT INTO-Anweisung eine Besonderheit auf. Sie wird nur dann korrekt ausgeführt, wenn sie genau einen Datensatz findet. Der Grund ist klar, in der INTO-Klausel werden Variablen bzw. eine RECORD-Variable angegeben und die können nur genau einen Datensatz aufnehmen. Wird kein Datensatz gefunden, so wird eine NO_DATA_FOUND-EXCEPTION ausgelöst, bei mehreren Datensätzen eine TOO_MANY_ROWS. In beiden Fällen bricht die Programmausführung beim SELECT INTO ab und springt in die EXCEPTION und schaut dort nach, ob die jeweilige Fehlermeldung dort abgehandelt wird. Sollen mehrere Datensätze verarbeitet werden, so muss ein CURSOR verwendet werden.

Syntax der SELECT INTO-Anweisung (Auszug):

   <SELECT Grundform mit INTO-Klausel> ::=
       SELECT [ALL/DISTINCT] <Spaltenausdruck> [, <Spaltenausdruck>...]
       INTO   {<PL/SQL-Variable> [, <PL/SQL-Variable>...]} | <Record-Variable>
       FROM Tabellenname [Abkürzung]
            [,Tabellenname [Abkürzung]]...
       [ WHERE  <Suchbedingung> ]
       [ GROUP BY Spaltenname [, Spaltenname]... ] 
       [ HAVING <Suchbedingung> ]
       [ ORDER BY <Sortierung > [,<Sortierung>]... ]

Beispiel:

   CREATE OR REPLACE PROCEDURE Loesche_Lagerbestand
   (p_Teilenr  IN   Teile.TNr%TYPE) 
   IS
       v_Nr         Teile.TNr%TYPE;
   BEGIN
      SELECT TNr INTO v_Nr
        FROM Teile
       WHERE TNr = p_Teilenr;
      -- hier geht's weiter, wenn genau ein Datensatz gefunden wird.
      -- da die TNr Primärschlüssel in der Teile-Tabelle ist, ist dies hier der Normalfall
      DELETE FROM Lagerbestand
       WHERE TNr = p_Teilenr;
      COMMIT;
   EXCEPTION
      -- hier landet das Programm, wenn eine falsche TNr übergeben wurde, die es gar nicht gibt
      WHEN NO_DATA_FOUND THEN
	   ROLLBACK;
           DBMS_OUTPUT.PUT_LINE (p_Teilenr ||' gibt es nicht in der Teile-Tabelle!');
      -- dieser Fall kann eigentlich nicht auftreten, da TNr Primärschlüssel ist und damit der Zugriff immer eindeutig
      -- auf diese EXCEPTION kann in diesem Fall verzichtet werden und ist hier der Vollständigkeit halber aufgeführt
      WHEN TOO_MANY_ROWS THEN
	   ROLLBACK;
	   DBMS_OUTPUT.PUT_LINE (p_Teilenr ||' gibt es doppelt in der Teile-Tabelle!');
   END;

siehe auch: EXCEPTION, CURSOR

Quellen:

  • Faeskorn-Woyke, Heide; Bertelsmeier, Birgit; Riemer, Petra; Bauer, Elena: "Datenbanksysteme - Theorie und Praxis mit SQL2003, Oracle und MySQL", Pearson Education, München, 2007, ISBN 978-3-8273-7266-6
  • Feuerstein, Steven, Pribyl. Bill: "Oracle PL/SQL Programming", O'Reilly, 2009, ISBN-13: 978-0596514464
  • Oracle® Database SQL Language Reference 11g Release 1 (11.1) in http://docs.oracle.com/cd/B28359_01/server.111/b28286/toc.htm
  • Oracle® Database PL/SQL Language Reference 11g Release 2 (11.2) in http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/toc.htm
  • Saurabh, Gupta: "Oracle Advanced PL/SQL Developer Professional Guide", Packt Publishing Limited, 2012, ISBN 978-1-84968-722-5

Kategorie: Oracle-PL-SQL, S