Source : Tutoriel informatique informatique
Quiconque a utilisé Oracle sait qu'Oracle possède un type de données appelé VARCHAR2, qui est utilisé pour représenter des chaînes de longueur variable. VARCHAR2 est également le type recommandé par Oracle. Mais il y a un problème avec l'utilisation de VARCHAR2 : il ne peut représenter qu'un maximum de 4000 caractères, ce qui équivaut à 2000 caractères chinois. Si la valeur d'un certain caractère dans votre programme est supérieure à 20 002 caractères chinois, VARCHAR2 ne peut pas répondre aux exigences. À l’heure actuelle, vous avez deux options : l’une consiste à utiliser plusieurs VARCHAR2 pour le représenter et l’autre consiste à utiliser des champs LOB. Nous examinons ici la deuxième méthode.
Tout d’abord, jetons un coup d’œil général aux champs LOB d’Oracle. Les types LOB d'Oracle sont divisés en trois types : BLOB, CLOB et BFILE. CLOB est appelé caractère LOB, BLOB et BFILE sont utilisés pour stocker des données binaires. La longueur maximale des CLOB et BLOB est de 4 Go et ils stockent les valeurs dans la base de données Oracle. BFILE est similaire à BLOB, mais il place les données dans un fichier externe, il est donc également appelé BLOB externe (External BLOB).
Je pense que nous connaissons tous MYSQL. Il existe des types de données similaires dans MYSQL, tels que TEXT et BLOB. Dans la fonction MYSQL de PHP, les opérations sur TEXT/BLOB sont directes, tout comme les autres types de données. Mais chez Oracle, la situation est différente. Oracle traite les LOB comme un type de données spécial et ne peut pas utiliser de méthodes conventionnelles dans les opérations. Par exemple, vous ne pouvez pas insérer directement de valeurs dans les champs LOB dans l'instruction INSERT, ni utiliser LIKE pour effectuer une recherche.
Voici quelques exemples pour illustrer comment utiliser la fonction OCI de PHP pour insérer, récupérer et interroger des données LOB.
L'insertion
ne peut pas utiliser directement l'instruction INSERT pour insérer des valeurs dans les champs LOB. Généralement, il y a les étapes suivantes :
1. Analysez d'abord une instruction INSERT et renvoyez un descripteur LOB
2. Utilisez la fonction OCI pour générer un objet LOB local
3. Liez l'objet LOB au descripteur LOB
4. Exécutez l'instruction INSERT
5. Attribuez une valeur à l'objet LOB
6. Libérez l'objet LOB et le handle de l'instruction SQL
L'exemple suivant stocke le fichier image téléchargé par l'utilisateur dans un BLOB (ou BFILE, l'opération est légèrement différente). Commencez par créer un tableau avec la structure suivante :
CREATE TABLE PICTURES (
NUMÉRO D'IDENTIFICATION,
DESCRIPTIONVARCHAR2(100),
MIME VARCHAR2(128),
BLOB D'IMAGE
);
Si vous souhaitez réaliser l'augmentation automatique de l'ID, créez une autre SEQUENCE :
CREATE SEQUENCE PIC_SEQ
puis le code du programme PHP utilisé pour traiter les données.
<?php
//Établir une connexion à la base de données Oracle
$conn = OCILogon($user, $password, $SID
//Soumettre des instructions SQL à Oracle
);
//Deux points à noter ici : Tout d'abord, utilisez la fonction EMPTY_BLOB(). Il s'agit d'une fonction interne d'Oracle qui renvoie un localisateur LOB. Lors de l'insertion d'un LOB, vous ne pouvez utiliser cette méthode que pour générer d'abord un localisateur LOB vide, puis opérer sur ce localisateur. La fonction EMPTY_BLOB() est destinée au type BLOB et celle correspondante pour CLOB est EMPTY_CLOB(). La seconde est la partie après RETURNING, qui renvoie l'image afin que la fonction OCI de PHP puisse la gérer.
$stmt = OCIParse($conn,"INSÉRER DANS LES IMAGES (identifiant, description, image)
VALUES (pic_seq.NEXTVAL, '$description', '$lob_upload_type', EMPTY_BLOB()) RETURNING Picture INTO :PICTURE");
//Génère un descripteur d'un objet LOB local. Notez le deuxième paramètre de la fonction : OCI_D_LOB, qui signifie Générer un objet LOB. D'autres possibilités sont OCI_D_FILE et OCI_D_ROWID, qui correspondent respectivement aux objets BFILE et ROWID
$lob = OCINewDescriptor($conn, OCI_D_LOB);
//Lier l'objet LOB généré au localisateur renvoyé par l'instruction SQL précédente. sur.
OCIBindByName($stmt, ':PICTURE', &$lob, -1, OCI_B_BLOB);
OCIExecute($stmt);
//Enregistre les données dans l'objet LOB. Étant donné que les données source ici sont un fichier, utilisez directement la méthode savefile() de l'objet LOB. D'autres méthodes d'objets LOB incluent save() et load(), qui sont utilisées respectivement pour enregistrer et récupérer des données. Mais le type BFILE n'a qu'une seule méthode, qui est save()
if($lob->savefile($lob_upload)){
OCICommit($conn);
echo "Téléchargement réussi<br>";
}autre{
echo "Échec du téléchargement<br>";
}
//Libérez l'objet LOB
OCIFreeDesc($lob);
OCIFreeStatement($stmt);
OCILogoff($conn);
?>
Il y a autre chose à noter : la valeur du champ LOB doit contenir au moins 1 caractère, donc avant save() ou savefile(), assurez-vous que la valeur ne peut pas être vide. Sinon, Oracle fera une erreur.
Il existe deux manières derécupérer
des données d'un LOB. L'une consiste à générer un objet LOB, puis à le lier au localisateur renvoyé par une instruction SELECT, puis à utiliser la méthode load() de l'objet LOB pour récupérer les données ; l'autre consiste à utiliser directement la fonction OCIFetch*** de PHP. La première méthode est beaucoup plus gênante que la deuxième méthode, je vais donc parler directement de la deuxième méthode.
Utilisez toujours le tableau ci-dessus.
<?php
$conn = OCILogon($utilisateur, $mot de passe, $SID);
$stmt = OCIParse($conn,"SELECT * FROM PICTURES WHERE ID=$pictureid");
OCIExecute($stmt);
//Le secret réside dans le troisième paramètre de PCIFetchInfo : OCI_RETURN_LOBS. Le troisième paramètre est le mode FETCH. Si OCI_RETURN_LOBS, la valeur LOB est directement placée dans le tableau de résultats au lieu du localisateur LOB, donc la méthode load() de l'objet LOB n'est pas nécessaire.
si (OCIFetchInto($stmt, $result, OCI_ASSOC+OCI_RETURN_LOBS))
{
echo "Type de contenu : " . StripSlashes($result[MIME]);
echo StripSlashes($result[PICTURE]);
}
OCIFreeStatement($stmt);
OCILogoff($conn);
?>
Ce programme est utilisé pour afficher les données (images) placées dans LOB. Méthode d'appel (en supposant que le nom du script est getpicture.php) :
<IMG SRC="getpicture.php?pictureid=99" ALT="Image placée dans Oracle LOB">
La requête
a été mentionnée précédemment et le champ LOB d'Oracle est LIKE ne peut pas être utilisé pour la correspondance. Ce qu'il faut faire? En fait, ce n'est pas compliqué. Oracle dispose d'un package anonyme appelé DBMS_LOB, qui contient tous les processus nécessaires au fonctionnement de LOB.
Supposons que vous ayez un tableau comme celui-ci :
CREATE TABLE ARTICLES (
NUMÉRO D'IDENTIFICATION,
TITRE VARCHAR2(100),
CLOB DE CONTENU
);
Le contenu de l'article est placé dans le champ CONTENU.
Maintenant, nous voulons trouver tous les articles contenant des « utilisateurs PHP chinois » dans le contenu. Nous pouvons procéder comme ceci :
<?php.
$conn = OCILogon($user, $password, $SID);
//La procédure DBMS_LOB.INSTR est utilisée dans la clause WHERE. Il comporte quatre paramètres. Les deux premiers représentent le localisateur LOB (peut être directement représenté par un champ) et la chaîne à rechercher ; les deux derniers représentent le décalage de départ et le nombre d'occurrences. Il convient de noter que sa valeur de retour doit être jugée, c'est-à-dire qu'elle doit être supérieure à 0.
$stmt = OCIParse($conn,"SELECT * FROM ARTICLES WHERE DBMS_LOB.INSTR(CONTENT, 'Utilisateur PHP chinois', 1, 1) > 0");
OCIExecute($stmt);
si (OCIFetchInto($stmt, $result, OCI_ASSOC+OCI_RETURN_LOBS))
{
...
}
OCIFreeStatement($stmt);
OCILogoff($conn);
?>
Oracle fournit également de nombreuses procédures pour exploiter les données LOB, telles que LENGTH, SUBSTR, etc. Quant à leur utilisation détaillée, vous pouvez consulter le manuel de développement d'Oracle.
Il s’agit des opérations sur les données de type LOB dans la base de données Oracle. Comme je n'ai pas été en contact avec Oracle depuis longtemps, il peut y avoir des erreurs dans cet article. Tout le monde est invité à me critiquer et à me corriger.