2014-02-10 10 views
5

Objekt zurückgegeben immer ich eine Funktion in PL/SQL haben:PL/SQL Wie eine Funktion aufzurufen, ohne

FUNCTION do_something 
    RETURN BOOLEAN 
IS 
    ... 
BEGIN 
    ... 
END 

Diese Funktion als solche bezeichnet werden kann:

DECLARE 
    answer BOOLEAN; 
BEGIN 
    answer := do_something(); 
END 

Nun gibt es Fälle, in denen ich den zurückgegebenen boolean nicht benötige. Wenn ich es nicht bekommen will und einfach schreiben:

do_something(); 

ich PLS-00306 (falsche Anzahl von Arten von Argumenten in Aufruf von do_something) Gibt es eine Möglichkeit, es zu nennen, ohne zu erklären und eine Einstellung Neuer Boolescher Wert, den ich in diesem Fall niemals verwenden werde?

+1

Seltsam ... Ich würde erwarten, ein 'PLS-002221: 'do_something' ist keine Prozedur oder undefined' vielleicht wegen der leeren '()'. Wie auch immer, nicht, dass ich es empfehle, aber Sie können es in eine "if" -Anweisung setzen, d. H. "IF (do_something)" dann null; end if; 'aber das ist wirklich hässlich –

+1

Irgendwie seltsam, da der Sinn einer Funktion darin besteht, etwas zurückzugeben, sonst sollte es wohl eine Prozedur sein. – tbone

+1

@tbone, vereinbart; Die Funktion sollte etwas wie 'something_was_done()' heißen :) –

Antwort

10

Ganz einfach: ein Verfahren schaffen, die diese Funktion

PROCEDURE do_something 
IS 
    dummy boolean; 
BEGIN 
    dummy := do_something(); 
END; 

Leider deckt, aber das ist der einzige Weg, in PL/SQL. Diese Sprache ist sehr streng in den Definitionen von Prozedur und Funktion, und Sie können keinen Funktionsaufruf durchführen, ohne das Ergebnis zu verarbeiten. Aber Sie können eine Prozedur erstellen, wie es im obigen Beispiel gezeigt wird.

Es wird automatisch definiert, wo die Funktion und wo das Verfahren auswählen.

EDIT

Soweit es Menschen gibt, die mich nicht trauen (manchmal habe ich wirklich schlechte Dinge sagen, so Zweifel erlaubt sind :)) dies ist der Test:

declare 
    myresult boolean; 

    function do_something return boolean 
    is 
    begin 
    return true; 
    end; 

    procedure do_something 
    is 
     dummy boolean; 
    begin 
    dummy := do_something(); 
    end; 
begin 
    myresult := do_something(); 

    do_something(); 
end; 

funktioniert gut .

+0

@Simn, Wäre es nicht ein 'ORA-00955: Name wird bereits von einem bestehenden Objekt verwendet?' –

+0

nein, siehe Antwort – smnbbrv

+0

Nein ... das liegt daran, dass Sie es in einem anonymen Block definiert haben. Versuchen Sie dasselbe in der Schema-Ebene –

Verwandte Themen