PHP 8.4.0 RC4 available for testing

oci_free_statement

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_free_statementLibère toutes les ressources réservées par un résultat Oracle

Description

oci_free_statement(resource $statement): bool

Libère toutes les ressources réservées par le résultat ou curseur Oracle statement. Ce dernier a été obtenu de la fonction oci_parse(), ou directement de Oracle.

Liste de paramètres

statement

Un identifiant de requête OCI valide.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

add a note

User Contributed Notes 3 notes

up
3
Jen M.
16 years ago
oci_free_statement doesn't always free up cursors. I had a query where I performed the following functions in a loop:

OCIParse
OCIExecute
Oci_fetch_assoc
(Grab some field values)
OciFreeStatement

I didn't specify the use of a cursor, but ran into a "maximum
open cursors exceeded" error. Within my code, I had one "select * from table_with_lobs" query. When I changed the query to be "select a, b, c, from table_with_lobs" (where I specified the actual column names and where those columns were not LOB fields) the error message went away and I didn't have to resort to upping the max_open_cursors value in Oracle.
up
2
rada at instinctive dot it
16 years ago
If you are using cursors, make sure to free the statement *and* the cursor, especially if there is a possibility of running the proc/cursor again (e.g. with different parameters).

<?php

oci_execute
($stmt);
oci_execute($crsr);

// iterate through cursor...

oci_free_statement($stmt);
oci_free_statement($crsr);
?>

You need to do it explicitly, closing connection for example does not seem to release the cursor.
up
1
passerbyxp at gmail dot com
11 years ago
A freed statement is not "empty()", it's still a resource:

<?php
$con
=oci_connect(/*connect*/);
$q=oci_parse($con,"SELECT sysdate FROM dual");
var_dump($q); // resource(5) of type (oci8 statement)
var_dump(empty($q)); // bool(false)
var_dump(oci_statement_type($q)); // string(6) "SELECT"
echo "------\n";
oci_execute($q);
var_dump($q); // same as above
var_dump(empty($q));
var_dump(oci_statement_type($q));
echo
"------\n";
oci_free_statement($q);
var_dump($q); // resource(5) of type (Unknown)
var_dump(empty($q)); // bool(false)
var_dump(oci_statement_type($q)); // generates warning and returns false
oci_close($con);
?>

So far I can not think of a way to determine if a statement is freed without using an additional flag...
To Top