PHP+Oracle OCI+CLOB

Oggi ho avuto necessità di leggere e scrivere da PHP un camp CLOB in una tabella di ORACLE.

Nel manuale al seguente indirizzo

http://php.net/manual/en/function.oci-new-descriptor.php

ho trovato subito il mio scenario.

Example #2 oci_new_descriptor() example

<?php
/* Calling PL/SQL stored procedures which contain clobs as input
 * parameters.
 * Example PL/SQL stored procedure signature is:
 *
 * PROCEDURE save_data
 *   Argument Name                  Type                    In/Out Default?
 *   ------------------------------ ----------------------- ------ --------
 *   KEY                            NUMBER(38)              IN
 *   DATA                           CLOB                    IN
 *
 */

$conn = oci_connect($user, $password);
$stmt = oci_parse($conn, "begin save_data(:key, :data); end;");
$clob = oci_new_descriptor($conn, OCI_D_LOB);
oci_bind_by_name($stmt, ':key', $key);
oci_bind_by_name($stmt, ':data', $clob, -1, OCI_B_CLOB);
$clob->write($data);
oci_execute($stmt, OCI_DEFAULT);
oci_commit($conn);
$clob->free();
oci_free_statement($stmt);
?>

Utilizzare PL/SQL permette di superare il limite di 4000 caratteri passati per il CLOB.

L’esempio nel manuale però dava errore.

Quello che ho dovuto modificare perchè il tutto funzionasse è stato sostituire

$clob->write($data);

con

$clob->writeTemporary($data);

Altrimenti ottenevo l’errore: OCI-Lob::write() : OCI_INVALID_HANDLE

Inoltre sarebbe bene ottenere il valore di ritorno dal oci_execute e fare la commit solo se “true”

$ok = oci_execute($stmt, OCI_DEFAULT);
if ($ok) {
    oci_commit($conn);
} else {
    oci_rollback($conn);
}

Nel caso qualcun altro avesse bisogno di questo scenario 😉

PHP+Oracle OCI+CLOB