phpInfo.netLes ArchivesLes éléPHPants

  
  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
?>


Synseo