Was ist pass by reference in oracle?
Lese ich im internet und fand, dass der IN-parameter in der Prozedur ist pass-by-reference. Können Sie bitte erklären mit einem Beispiel? Vielen Dank im Voraus.
- Was Sie suchen, zu erklären? Das Konzept, einen Wert per Referenz übergeben? Oder etwas bestimmtes zu PLSQL?
- Ich bin auf der Suche nach der Erklärung mit Beispiel.
- Aus dem Handbuch: Unterprogramm-Parameter
Du musst angemeldet sein, um einen Kommentar abzugeben.
Besser zu verstehen, lassen Sie uns prüfen, wie PL/SQL-handle-Parameter in zwei Arten:
Durch Verweis
In diesem Fall ein Zeiger auf den aktualparameter übergeben wird, die entsprechenden formalen parameter. Sowohl aktuelle und formale Parameter auf der gleichen Position im Speicher und speichert den Wert des Parameters.
Von Wert
In diesem Fall wird der Wert des aktualparameters wird kopiert und an die entsprechenden formalen parameter. Wenn das Programm beendet sich dann, ohne eine Ausnahme, die formalen parameter Wert wird kopiert auf die eigentlichen parameter. Wenn ein Fehler Auftritt, werden die geänderten Werte werden nicht übernommen, zurück zu den eigentlichen parameter.
Standardmäßig OUT-und IN OUT-Parameter als Wert übergeben werden und die Parameter werden per Referenz übergeben. Wenn Sie einen OUT-oder IN OUT-parameter geändert wird innerhalb der Prozedur die Prozedur eigentlich nur ändert eine Kopie des parameter-Wert. Erst wenn das Verfahren abgeschlossen hat, ohne Ausnahme, ist das Ergebnis Wert zurück kopiert den formalen parameter.
TEST:
Obigen Beispiel wird die print
200
auf dem Bildschirm. Es gibt zwei Parameter übergeben, umadd_numbers
Verfahren:par_in
ist der ModusIN
. Dieser parameter wird per Referenz übergeben. Also, inadd_numbers
Verfahren, keine weitere Kopie des Parameters erstellt werden. Vielmehr ist die gleiche Kopie verwendet werden. Wenn Sie berechtigt sind, um den Wert zu ändernfirst_val
innenadd_numbers
Verfahren (aber Sie nicht), der Wert spiegelt direkt zupar_in
. Weil einfach beidefirst_val
undpar_in
sind zwei Namen für den gleichen Speicherbereich.par_inout
ist der ModusIN OUT
. Dieser parameter durch Wert übergeben wird, standardmäßig aktiviert. Also, inadd_numbers
Verfahren, neue (Speicherort) für die Speicherung der weitere Kopie dieser parameter. Daherpar_inout
ist ein name, der an einen anderen Speicherort im Arbeitsspeicher alssecond_val
. Sie zwei Namen zu zwei verschiedenen Orten.Die Implikation des zweiten Parameters ist, dass, nachdem die Linie
second_val := first_val + second_val;
ausgeführt wird, wird der Wert vonsecond_val
unterscheidet sich der Wert vonpar_inout
bis zum Ende des Verfahrens. Nur am Ende der Prozedur, der Wert dersecond_val
verabschiedet werden, umpar_inout
.Nun, wenn Sie eine große Sammlung als OUT oder IN OUT-parameter, dann wird es als Wert übergeben werden, in anderen Worten: die gesamte Kollektion wird in Kopie an die formalen parameter bei der Eingabe der Prozedur und wieder beim beenden der Prozedur. Wenn die Sammlung ist groß, kann dies dazu führen, um unnötige CPU-und Speicher-Verbrauch.
Den NOCOPY-Parameter-Modus Hinweis lindert dieses problem, weil Sie können es verwenden, um die Laufzeitumgebung anweisen, den Motor zu versuchen, pass OUT oder IN OUT-Parameter per reference anstatt per value
Den Hinweis-Anfragen, PL/SQL-runtime-engine, um eine IN-OUT-argument per Referenz statt als Wert. Dies kann zu beschleunigen, um die Leistung Ihrer Programme, da by-reference Argumente sind nicht kopiert, innerhalb des Programm-Einheit. Wenn Sie an großen, komplexen Strukturen wie Sammlungen, Datensätze oder Objekte, diese Kopie Schritt kann teuer werden.