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 😉