Signatur
Beschreibung
oci_free_statement() gibt den Speicher und alle internen Ressourcen frei, die einem zuvor mit oci_parse() erzeugten oder durch einen REF-Cursor erhaltenen Oracle-Statement-Handle zugeordnet sind. Nach dem Aufruf ist das Handle ungültig und darf nicht mehr verwendet werden.
In lang laufenden Skripten oder Schleifen, die viele Abfragen ausführen, ist es wichtig, Statements nach ihrer Verwendung explizit freizugeben, um Speicherlecks und die Erschöpfung von Oracle-Cursor-Ressourcen zu vermeiden. Oracle begrenzt die Anzahl gleichzeitig offener Cursor pro Session (Parameter OPEN_CURSORS in der Oracle-Datenbank).
Die Funktion gibt true zurück, wenn die Ressource erfolgreich freigegeben wurde, und false bei einem Fehler – etwa wenn das übergebene Argument kein gültiges Statement-Handle ist. Für Verbindungs-Handles steht die Funktion oci_close() zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $statement Pflicht | resource | Ein gültiges OCI8-Statement-Handle, wie es von oci_parse() zurückgegeben oder als REF-Cursor-Variable gebunden wurde. |
Rückgabewert
true zurück, wenn die Ressource erfolgreich freigegeben wurde, oder false bei einem Fehler (z. B. ungültiges Handle).Beispiele
Einfaches SELECT mit anschließender Ressourcenfreigabe
<?php
$conn = oci_connect('username', 'password', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlspecialchars($e['message']), E_USER_ERROR);
}
$sql = 'SELECT employee_id, last_name FROM employees WHERE rownum <= 5';
$stmt = oci_parse($conn, $sql);
oci_execute($stmt);
while ($row = oci_fetch_assoc($stmt)) {
echo $row['EMPLOYEE_ID'] . ': ' . $row['LAST_NAME'] . "\n";
}
// Ressourcen des Statements explizit freigeben
$freed = oci_free_statement($stmt);
echo $freed ? 'Statement erfolgreich freigegeben.' : 'Fehler beim Freigeben.';
oci_close($conn);
?>
Massenverarbeitung in einer Schleife – Cursor-Erschöpfung vermeiden
<?php
$conn = oci_connect('username', 'password', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlspecialchars($e['message']), E_USER_ERROR);
}
$departments = [10, 20, 30, 40, 50];
foreach ($departments as $deptId) {
$stmt = oci_parse($conn, 'SELECT COUNT(*) AS cnt FROM employees WHERE department_id = :dept_id');
oci_bind_by_name($stmt, ':dept_id', $deptId);
oci_execute($stmt);
$row = oci_fetch_assoc($stmt);
echo "Abteilung $deptId: " . $row['CNT'] . " Mitarbeiter\n";
// Statement nach jeder Iteration freigeben, um Cursor-Limit nicht zu überschreiten
oci_free_statement($stmt);
}
oci_close($conn);
?>
// Wichtig · Fallstricke
Cursor-Limit: Oracle begrenzt die Anzahl gleichzeitig geöffneter Cursor pro Session über den Datenbankparameter OPEN_CURSORS (Standard: 300). Werden Statements nicht freigegeben, kann dieser Grenzwert schnell erreicht werden, was zu ORA-01000: maximum open cursors exceeded-Fehlern führt.
Automatische Freigabe: Am Ende eines PHP-Skripts werden alle nicht explizit freigegebenen Ressourcen automatisch bereinigt. In lang laufenden Prozessen (z. B. PHP-CLI-Daemons) oder Schleifen mit vielen Iterationen sollte oci_free_statement() jedoch stets manuell aufgerufen werden.
REF-Cursor: Auch Cursor-Handles, die über oci_new_cursor() und oci_bind_by_name() als REF-CURSOR gebunden wurden, müssen nach der Verwendung mit oci_free_statement() freigegeben werden.