2017-12-18 2 views
-2

Mit PL/SQL ist es möglich, eine gespeicherte Funktion innerhalb derselben Funktion aufzurufen. Dies kann mit dem folgende Beispiel demonstriert werden:Können PL/SQL-Prozeduren sich selbst rekursiv aufrufen?

CREATE OR REPLACE FUNCTION factorial(x in number) 
RETURN number 
IS 
    f number; 
BEGIN 
    IF x = 0 THEN 
     f := 1; 
    ELSE 
     f := x * factorial(x-1); 
    END IF; 
RETURN f; 
END; 
/

DECLARE 
    num number; 
    factorial number; 
BEGIN 
    num := # 
    factorial := factorial(num); 
    dbms_output.put_line(' The factorial of '|| num || ' is ' || factorial); 
END; 
/

Kann dies auch mit PL/SQL gespeicherte Prozeduren durchgeführt werden?

+4

Warum noch einfach ausprobieren, um herauszufinden, ? –

Antwort

2

Ja, Sie können eine Prozedur schreiben, die sich in PL/SQL rekursiv aufruft. Hier ist ein Beispiel - Implementierung der Fakultät.

Mit diesem gesagt, schreiben Sie nie eine Prozedur (oder eine Funktion wie Ihre) ohne Fehlerbehandlung. Wenn Sie nicht verstehen, warum, ändern Sie 5 zu 5.3 im anonymen Block unten, und Sie werden sehen, warum.

CODE Fenster:

create or replace procedure fact (x in number, x_fact out number) 
as 
begin 
    if x = 0 then x_fact := 1; 
    else   fact(x-1, x_fact); 
       x_fact := x * x_fact; 
    end if; 
end; 
/

set serveroutput on 

declare 
    z number; 
begin 
    fact(5, z); 
    dbms_output.put_line(z); 
end; 
/

Skript-Ausgabe-Fenster (jedes „Ergebnis“ zu dem entsprechenden Teil des Codes passend links als Übung):

Procedure FACT compiled 

PL/SQL procedure successfully completed. 

120 
2

Sie können PL/SQL-Funktionen sicher rekursiv aufrufen (mit allen üblichen Warnungen über die Gefahren in einer beliebigen Sprache!).

Sie werden jedoch in Schwierigkeiten geraten, wenn Sie eine lokale Variable wie Ihre Funktion benennen. Sie werden zum Beispiel erhalten diese Fehlermeldung, wenn Sie versuchen, den Block auszuführen:

PLS-00222: no function with name 'FACTORIAL' exists in this scope 
+2

Was Sie hier zeigen, ist sicherlich richtig; aber das war nicht die Frage. – mathguy

Verwandte Themen