Accueil
Trucs & Astuces
Scripts
Regex
Annuaire
Articles
.
|
Astuces PHP Oracle
Extraire des BLOB d'une base Oracle | [22-01-2002] |
Posté par hg
Voici un moyen de récupérer une image ou tout autre objet stocké dans un champ de type BLOB dans une base Oracle. Tout d'abord on récupère l'identifiant du BLOB avant de lire le BLOB par paquets. On remarquera une utilisation peut courante en PHP du passage de requête. Ici on passe en fait un script PL-SQL. Les packages dbms_lob et utl_raw doivent être présents dans la base (procédures stockées de l'utilisateur SYS).
<? $taille=0; //-- recupération de l'identifiant et de la taille du blob $requete= "declaren"; $requete.=" lobloc blob;n"; $requete.="beginn"; $requete.=" select image into :lobloc from $table "; $requete.="where numimage=$numimage;n"; $requete.=" :taille:=dbms_lob.getlength(:lobloc);n"; $requete.="end;"; $leblob=ocinewdescriptor($connection,OCI_D_LOB); $moncursor = OCIParse ($connection, $requete); ocibindbyname($moncursor,':lobloc',&$leblob,-1,OCI_B_BLOB); ocibindbyname($moncursor,':taille',&$taille,10); $result=ociexecute($moncursor); //-- lecture du blob $leraw=""; //---chaine de récupération $offset=1; //---buffer de lecture (a moduler selon les cas 32000 en general) $buf_max=16000; while ($offset<$taille) { if ($taille>($offset+$buf_max-1)) $amount=$buf_max; else $amount=$taille-$offset+1;
$lebuf=""; //lit le blob de offset à un maxi de $buf_max $requete= "declaren"; $requete.=" lebuffer raw(32000);amount number:=$amount;"; $requete.="offset number:=$offset;n"; $requete.="beginn"; $requete.=" dbms_lob.read(:lobloc,amount,offset,lebuffer);n"; $requete.=" :buffer:=utl_raw.cast_to_varchar2(lebuffer);n"; $requete.="end;"; $moncursor = OCIParse ($connection, $requete); ocibindbyname($moncursor,':lobloc',&$leblob,-1,OCI_B_BLOB); ocibindbyname($moncursor,':buffer',&$lebuf,32000); $result=ociexecute($moncursor); $offset=$offset+$amount; $leraw.=$lebuf; } //-- $leraw contient le fichier image ?> |
|
|
|
|