Lire une colonne Oracle de type BLOB avec 4D for OCI

Stéphanie Tirtiat

- Titre : Lire une colonne Oracle de type BLOB avec 4D for OCI

- Auteur : Stéphanie Tirtiat

- Parution : 27 juin 2007

- Licence : Copyright ® 2007 4D s.a. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

Produit : 4D for OCI 2004 · Plateforme : Mac & Win ♪

Voici un code exemple qui récupère les données dans une colonne Oracle de type BLOB avec les commandes du plugin 4D for OCI 2004 :

` ----------------------------------------------------
` User name (OS): Stirtiat
` Date and time: 27/06/07, 18:42:22
` ----------------------------------------------------
` Method: OCI_LIRE_BLOB
` ----------------------------------------------------

`paramètres de connexion à modifier
$user:="xxx"
$password:="xxx"
$server:="xxx"
`login complexe
status:=OCIEnvCreate (envhp;OCI_DEFAULT )
status:=OCIHandleAlloc (envhp;errhp;OCI_HTYPE_ERROR )
status:=OCIHandleAlloc (envhp;svchp;OCI_HTYPE_SVCCTX )
status:=OCIHandleAlloc (envhp;authp;OCI_HTYPE_SESSION )
status:=OCIHandleAlloc (envhp;srvhp;OCI_HTYPE_SERVER )
status:=OCIServerAttach (srvhp;errhp;$server)
status:=OCIAttrSetVal (svchp;srvhp;OCI_ATTR_SERVER ;errhp)
status:=OCIAttrSetText (authp;$user;OCI_ATTR_USERNAME ;errhp)
status:=OCIAttrSetText (authp;$password;OCI_ATTR_PASSWORD ;errhp)
status:=OCISessionBegin (svchp;errhp;authp;OCI_CRED_RDBMS ;OCI_DEFAULT )
status:=OCIAttrSetVal (svchp;authp;OCI_ATTR_SESSION ;errhp)

`requête SQL
$sql_statement:="SELECT t_blob FROM test_lob WHERE t_id = 1"

C_ENTIER LONG(bloblocator)
C_ENTIER LONG($define;$position;$sqlt)
C_POINTEUR($p_define)
C_ENTIER LONG(null_ind01;rlen01;rcode01)

bloblocator:=0
$define:=0
$position:=1
$p_define:=->bloblocator
$sqlt:=SQLT_BLOB
C_BLOB($blob)

`préparation requête
status:=OCIHandleAlloc (envhp;stmthp;OCI_HTYPE_STMT )
status:=OCIDescriptorAlloc (envhp;bloblocator;OCI_DTYPE_LOB )
status:=OCIStmtPrepare (stmthp;errhp;$sql_statement;OCI_DEFAULT )
status:=OCIDefineByPos (stmthp;$define;errhp;$position;$p_define;$sqlt;->null_ind01;->rlen01;->rcode01;OCI_DEFAULT )

status:=OCIStmtExecute (svchp;stmthp;errhp;1;0;0;0;OCI_DEFAULT )

status:=OCILobRead (svchp;errhp;bloblocator;1;$blob)

`libération
status:=OCIDescriptorFree (bloblocator)
status:=OCIHandleFree (stmthp)
status:=OCISessionEnd (svchp;errhp;authp)
status:=OCIServerDetach (srvhp;errhp)
status:=OCICleanUp

`récupération du blob dans un fichier
Si (Taille BLOB($blob)>0)

`si la colonne BLOB Oracle a été alimentée par 4D for Oracle,
`il faut retirer les 8 premiers octets du BLOB reçu
`SUPPRIMER DANS BLOB($blob;0;8)

`on nomme en dur le fichier mais on peut créer le nom par programmation
`et récupérer le type de fichier dans le blob pour l'extension
`  --voir astuce "Tester des documents image par leur marqueur"(*)
$DocRef:=Creer document("image_1.jpg")
Si (OK=1)
FERMER DOCUMENT($DocRef)
BLOB VERS DOCUMENT(Document;$blob)
Fin de si

Sinon
ALERTE("Pas de contenu dans le blob !")
Fin de si

`on vide le blob
FIXER TAILLE BLOB($blob;0)

Description de la table Oracle qui a servi à cet exemple :

CREATE TABLE TEST_LOB (
T_ID NUMBER(5,0),
T_NAME VARCHAR2(80),
T_BLOB BLOB
);

Compléments d'information :
· Documentations Oracle et 4D for OCI
· 4D for OCI : Lire une colonne Oracle de type LONG RAW
· 4D for OCI : Écrire dans une colonne Oracle de type LONG RAW
· 4D ODBC Pro : Lire une colonne Oracle de type BLOB
· 4D ODBC Pro : Écrire dans une colonne Oracle de type BLOB
· Introduction aux OCI
· 4D et les autres SGBDR

(*) Tester des documents image par leur marqueur