Mein Verständnis ist OUT formale Parameter sollten immer auf NULL, wenn die Prozedur aufgerufen wird.Oracle out Parameter nicht NULL
parameter_tests.getstring würde erwarten, "Parameter null" beide Male um die Anruferproc-Schleife auszugeben. Und wenn Sie den Code ausführen, passiert genau das.
Die Ausgabe von parameter_tests.getcursor zeigt jedoch an, dass der Referenzcursor zum zweiten Mal in der Schleife geöffnet ist.
Wenn der Formalparameter p_out beim Aufruf von getcursor auf Null gesetzt wurde, würden wir erwarten, dass der Referenzcursor geschlossen wird. Stattdessen übergibt es den offenen Referenzcursor und es ist eigentlich die OPEN FOR, die den offenen Referenzcursor aufräumt (und verhindert, dass wir die maximal offenen Cursor treffen, wenn Sie hunderte von Wiederholungen durchführen).
Wenn ich manuell den Referenzcursor zwischen Aufrufen auf Null setzt, verhält es sich wie erwartet.
Kann mir jemand sagen, warum Referenz-Cursor als Sonderfall behandelt werden, wenn sie OUT-Parameter sind? Und welche anderen Arten werden anders behandelt?
Die Datenbankversion ist 11.2.0.2.0.
Große Antwort. Vielen Dank. Sie haben recht, wenn explizites Schließen die beste Wahl ist. Die Quelle der Frage untersuchte tatsächlich ein Problem mit nicht geschlossenen Cursorn und wir fanden heraus, dass wir die Cursorgrenze nicht überschreiten konnten, indem wir sie in einer Schleife öffneten. –