Announcement

Collapse
No announcement yet.

PL / SQL - Funktionen vs. Prozeduren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • PL / SQL - Funktionen vs. Prozeduren

    Hallo zusammen!

    Ich bin relativ neu in PL / SQL und hätte folgende Frage:
    Momentan benutze ich ausschließlich Funktionen wenn ich ein Programm schreibe. Das finde ich, aufgrund der Return Codes / Exception Handling, besser als Prozeduren, in denen so etwas nicht zurückgegeben werden muss.
    Wo ist also der Vorteil von Prozeduren? Warum sollte ich diese einsetzen, wenn es auch alles in Funktionen realisierbar ist?

    Dankeschön im Voraus!

    Gruß
    Iloivar
    Gruß
    Iloivar

  • #2
    Es gibt eingentlich keinen speziellen Grund für oder gegen Funktionen und Prozeduren.
    Wenn dein Methode einen Wert zurück geben soll, verwende eine Funktion. Wenn nicht kannst du auch eine Prozedur nehmen.

    Es gibt Leute die vertreten die Meinung, es ist nicht "elegant", wenn eine Funktion Daten in der DB verändert - dafür sind Prozeduren da.
    Damit sind wir auch schon bei einer Einschränkung von Funktionen: Wenn du eine Funktion in einem SELECT verwenden möchtest, darf sie keine Daten verändern.

    Gruss

    Comment


    • #3
      Neben Wernfrieds Hinweisen:
      Auch Exception Handling funktioniert in Prozeduren vollkommen analog zu Funktionen.
      Verdacht, reichst Du Exceptions über den Funktionsrückgabewert durch? Möglich aber eher ungewöhnlich bzw unnötig.

      Erwähnenswert währen da noch Packages, die Funktionen und Prozeduren, (package globale) Variablen und z.B. lokale/interne Funktionen, Prozeduren enthalten können.
      Gruß, defo

      Comment


      • #4
        Bei Triggern gilt eine Größe von maximal 32 K. Wenn der Trigger größer sein muss, dann wird eine gespeicherte Prozedur aufgerufen. Der Aufruf einer gespeicherten Funktion ist dagegen nicht erlaubt.

        kuemmelchen

        Comment


        • #5
          Danke für die schnellen Anwtorten

          @Wernfried
          Ich habe noch nie in einem Select eine Funktion aufgerufen. Ich habe deswegen mal eine ganz einfache Funktion geschrieben die nur den Return Code 1 zurückgibt.

          Code:
          CREATE OR REPLACE FUNCTION select_test
          RETURN NUMBER
          AS
          
          v_rc NUMBER;
          v_x NUMBER := 1;
          v_y NUMBER := 1;
          BEGIN
          
           IF v_x = v_y
           THEN RETURN 1;
           END IF; 
           
          END select_test;
          Wie müsste ein Update auf eine Tabelle dann beispielsweise aussehen?

          Code:
          UPDATE tabelle
          SET test = bla
          WHERE v_rc = 1
          In der WHERE klausel müsste ja der Return Code = 1 angegeben werden. Nur wie?^^
          (Laut deinem Text dürfte das Update ja nicht funktionieren. Darum geht es mir auch nicht. Ich möchte es nur einmal gemacht haben )

          ---

          @defo

          Ich bin mir nicht sicher ob ich den Satz "Verdacht, reichst Du Exceptions über den Funktionsrückgabewert durch? Möglich aber eher ungewöhnlich bzw unnötig." richtig verstehe.
          Also ja, am Ende jeder Funktion habe ich Exceptions die den Return Code 9 zurückgeben. Wird der Return Code 9 zurückgegeben, wird das Programm abgebrochen. Wolltest du darauf hinaus?

          ---

          @kuemmelchen

          Wenn ich also einen Trigger erstelle, der größer ist als die 32k, dann funktioniert das nicht und ich muss selbst eine Prozedur schreiben die denselben Effekt wie ein Trigger hat?


          Die Funktionen sind übrigens in einem Package (jedenfalls die, die zusammengehören) Entschuldigt, falls es etwas dumme Fragen sind, bin halt noch nicht so fit in PL/SQL

          Gruß Iloivar
          Gruß
          Iloivar

          Comment


          • #6
            Hier mal zwei Funktionen:

            [HIGHLIGHT=plsql]
            CREATE OR REPLACE FUNCTION Gestern RETURN DATE IS
            BEGIN
            RETURN SYSDATE - 1;
            END;
            /

            CREATE OR REPLACE FUNCTION Gestern_Update RETURN DATE IS
            BEGIN
            UPDATE tabelle SET spalte_bla = NULL;
            RETURN SYSDATE;
            END;
            /
            [/HIGHLIGHT]

            Die erste kannst du überall verwenden, die andere nicht:
            Code:
            SELECT Gestern FROM dual;
            
            GESTERN 
            --------
            05.11.13
            1 row selected.
            
            
            SELECT Gestern_Update FROM dual;
            
            SELECT Gestern_Update FROM dual
                   *
            Error at line 1
            ORA-14551: cannot perform a DML operation inside a query 
            ORA-06512: at "PMDSYS.GESTERN_UPDATE", line 3

            Aber Vorsicht, innerhalb eines PL/SQL Blocks funktioniert es:
            [HIGHLIGHT=plsql]
            DECLARE
            res DATE;
            BEGIN
            res := Gestern_Update;
            DBMS_OUTPUT.PUT_LINE ( 'res = ' || res );
            END;
            /

            res = 06.11.13

            PL/SQL procedure successfully completed.
            [/HIGHLIGHT]

            Das ist dann genau der nicht so "elegante" Fall von dem ich oben geschrieben habe.

            Gruss

            Comment


            • #7
              @kuemmelchen
              Wenn ich also einen Trigger erstelle, der größer ist als die 32k, dann funktioniert das nicht und ich muss selbst eine Prozedur schreiben die denselben Effekt wie ein Trigger hat?
              Nein. Nur der Trigger-Body (PL/SQL-Block) wird durch den Aufruf (CALL) der gespeicherten Prozedur ersetzt.

              kuemmelchen

              Comment

              Working...
              X