[TL; DR] Funktionen mit out-Parametern können nur in PL/SQL verwendet werden.
Als Beispiel:
CREATE FUNCTION test_out(
value OUT NUMBER
) RETURN NUMBER
IS
BEGIN
value := 1;
RETURN 2;
END;
/
Sie können diese/SQL in PL laufen:
SET SERVEROUTPUT ON;
DECLARE
a NUMBER;
b NUMBER;
BEGIN
a := test_out(b);
DBMS_OUTPUT.PUT_LINE(a || ', ' || b);
END;
/
Ausgänge 2, 1
jedoch versuchen, die gleiche Sache in SQL (die Schaffung eines zu tun Bindevariable über Oracle SQL Developer):
VARIABLE a NUMBER;
SELECT test_out(:a) FROM DUAL;
PRINT a;
Gibt Ihnen die Ausnahme:
SQL Error: ORA-06572: Function TEST_OUT has out arguments
06572. 00000 - "Function %s has out arguments"
*Cause: A SQL statement references either a packaged, or a stand-alone,
PL/SQL function that contains an OUT parameter in its argument
list. PL/SQL functions referenced by SQL statements must not
contain the OUT parameter.
*Action: Recreate the PL/SQL function without the OUT parameter in the
argument list.
Funktionen per definitionem keine Ausgabeparameter unterstützen. Wenn Sie sich die Dokumentation der Funktionen ansehen, auf die in der zitierten Quelle verwiesen wird, werden Sie sehen, dass die Spezifikation von allen keinen "Ausgabeparameter" enthält - im Gegensatz zu einem Rückgabewert. Ich sehe nicht einmal etwas in der PL/SQL-Referenz, um anzuzeigen, dass eine PL/SQL-Funktion etwas anderes machen kann. Und schauen Sie sich das Dokument zu CREATE FUNCTION an. Die gleiche Geschichte. – EdStevens
Um die Antwort von Ed auszuarbeiten: In PL/SQL können Sie einige Verarbeitungs- und Ausgabewerte über out-Parameter ausführen, aber diese Art von Programm wird als Prozedur und nicht als Funktion bezeichnet. Diese Art von Terminologie kann in anderen Sprachen etwas anders verwendet werden, aber dies ist die Verwendung von Oracle. – mathguy
@EdStevens Funktionen ** do ** unterstützen Parameter: 'CREATE FUNCTION test_out ( Wert AUSGABE NUMMER ) RÜCKSENDE NUMMER IS BEGIN Wert: = 1; RÜCKKEHR 2; ENDE; /'dann können Sie' DECLARE eine NUMMER; b NUMMER; BEGINN a: = test_out (b); DBMS_OUTPUT.PUT_LINE (a || ',' || b); ENDE; /' – MT0