Quelle: IT Computer Tutorial
Jeder, der Oracle verwendet hat, weiß, dass Oracle über einen Datentyp namens VARCHAR2 verfügt, der zur Darstellung von Zeichenfolgen variabler Länge verwendet wird. VARCHAR2 ist auch der von Oracle empfohlene Typ. Bei der Verwendung von VARCHAR2 gibt es jedoch ein Problem: Es kann nur maximal 4000 Zeichen darstellen, was 2000 chinesischen Schriftzeichen entspricht. Wenn der Wert eines bestimmten Zeichens in Ihrem Programm mehr als 20.002 chinesische Zeichen beträgt, kann VARCHAR2 die Anforderungen nicht erfüllen. Zu diesem Zeitpunkt haben Sie zwei Möglichkeiten: Eine besteht darin, mehrere VARCHAR2 zur Darstellung zu verwenden, und die andere darin, LOB-Felder zu verwenden. Hier werfen wir einen Blick auf die zweite Methode.
Werfen wir zunächst einen allgemeinen Blick auf die LOB-Felder von Oracle. Die LOB-Typen von Oracle sind in drei Typen unterteilt: BLOB, CLOB und BFILE. CLOB heißt Zeichen-LOB, BLOB und BFILE werden zum Speichern von Binärdaten verwendet. Die maximale Länge von CLOB und BLOB beträgt 4 GB und sie speichern Werte in der Oracle-Datenbank. BFILE ähnelt BLOB, speichert Daten jedoch in einer externen Datei und wird daher auch als externes BLOB (External BLOB) bezeichnet.
Ich denke, wir sind alle mit MYSQL vertraut. In MYSQL gibt es ähnliche Datentypen wie TEXT und BLOB. In der MYSQL-Funktion von PHP sind Operationen an TEXT/BLOB direkt, genau wie bei anderen Datentypen. Bei Oracle ist die Situation jedoch anders. Oracle behandelt LOBs als einen speziellen Datentyp und kann in Operationen keine herkömmlichen Methoden verwenden. Beispielsweise können Sie in der INSERT-Anweisung keine Werte direkt in LOB-Felder einfügen und auch nicht mit LIKE suchen.
Hier sind einige Beispiele, die veranschaulichen, wie Sie die OCI-Funktion von PHP zum Einfügen, Abrufen und Abfragen von LOB-Daten verwenden.
Beim Einfügen
kann die INSERT-Anweisung nicht direkt zum Einfügen von Werten in LOB-Felder verwendet werden. Im Allgemeinen gibt es die folgenden Schritte:
1. Analysieren Sie zunächst eine INSERT-Anweisung und geben Sie einen LOB-Deskriptor zurück
. 2. Verwenden Sie die OCI-Funktion, um ein lokales LOB-Objekt zu generieren
. 3. Binden Sie das LOB-Objekt an den LOB-Deskriptor.
4. Führen Sie die INSERT-Anweisung aus
. 5. Zuweisen einen Wert für das LOB-Objekt
6. Geben Sie das LOB-Objekt und das SQL-Anweisungshandle frei.
Im folgenden Beispiel wird die vom Benutzer hochgeladene Bilddatei in einem BLOB (oder BFILE, der Vorgang ist etwas anders) gespeichert. Erstellen Sie zunächst eine Tabelle mit folgender Struktur:
TABELLE BILDER ERSTELLEN (
ID-NUMMER,
BESCHREIBUNG VARCHAR2(100),
MIME VARCHAR2(128),
BILDBLOB
);
Wenn Sie die automatische Erhöhung der ID realisieren möchten, erstellen Sie eine weitere SEQUENCE:
CREATE SEQUENCE PIC_SEQ;
und dann den PHP-Programmcode, der zur Verarbeitung der Daten verwendet wird.
<?php
//Eine Oracle-Datenbankverbindung herstellen
$conn = OCILogon($user, $password, $SID);
//SQL-Anweisungen an Oracle senden
//Hier sind zwei Punkte zu beachten: Verwenden Sie zunächst die Funktion EMPTY_BLOB(). Dies ist eine interne Funktion von Oracle, die einen LOB-Locator zurückgibt. Beim Einfügen eines LOB können Sie diese Methode nur verwenden, um zunächst einen leeren LOB-Locator zu generieren und dann diesen Locator zu bearbeiten. Die Funktion EMPTY_BLOB() ist für den Typ BLOB und die entsprechende Funktion für CLOB ist EMPTY_CLOB(). Der zweite Teil ist der Teil nach RETURNING, der das Bild zurückgibt, damit die OCI-Funktion von PHP damit umgehen kann.
$stmt = OCIParse($conn,"INSERT INTO PICTURES (ID, Beschreibung, Bild)
VALUES (pic_seq.NEXTVAL, '$description', '$lob_upload_type', EMPTY_BLOB()) RETURNING picture INTO :PICTURE");
//Generieren Sie einen Deskriptor eines lokalen LOB-Objekts. Beachten Sie den zweiten Parameter der Funktion: OCI_D_LOB, der
bedeutet, ein LOB-Objekt zu generieren.OCI_D_FILE
und OCI_D_ROWID entsprechen jeweils BFILE- und ROWID-Objekten.
// Binden Sie das generierte LOB-Objekt an den von der vorherigen SQL-Anweisung zurückgegebenen. on.
OCIBindByName($stmt, ':PICTURE', &$lob, -1, OCI_B_BLOB);
OCIExecute($stmt);
//Daten im LOB-Objekt speichern. Da es sich bei den Quelldaten hier um eine Datei handelt, verwenden Sie direkt die Methode savefile() des LOB-Objekts. Weitere Methoden von LOB-Objekten sind save() und load(), die zum Speichern bzw. Abrufen von Daten verwendet werden. Aber der BFILE-Typ hat nur eine Methode, nämlich save()
if($lob->savefile($lob_upload)){
OCICommit($conn);
echo „Upload erfolgreich<br>“;
}anders{
echo „Upload fehlgeschlagen<br>“;
}
//Das LOB-Objekt freigeben
OCIFreeDesc($lob);
OCIFreeStatement($stmt);
OCILogoff($conn);
?>
Es gibt noch etwas zu beachten: Der Wert des LOB-Felds muss mindestens 1 Zeichen lang sein. Stellen Sie daher vor save() oder savefile() sicher, dass der Wert nicht leer sein darf. Andernfalls macht Oracle einen Fehler.
Es gibt zwei Möglichkeiten, Daten aus einem LOBabzurufen
. Eine besteht darin, ein LOB-Objekt zu generieren, es dann an den von einer SELECT-Anweisung zurückgegebenen Locator zu binden und dann die Methode „load()“ des LOB-Objekts zu verwenden, um die Daten abzurufen. Die andere besteht darin, die OCIFetch***-Funktion von PHP direkt zu verwenden. Die erste Methode ist viel problematischer als die zweite Methode, daher werde ich direkt auf die zweite Methode eingehen.
Verwenden Sie weiterhin die obige Tabelle.
<?php
$conn = OCILogon($user, $password, $SID);
$stmt = OCIParse($conn,"SELECT * FROM PICTURES WHERE ID=$pictureid");
OCIExecute($stmt);
//Das Geheimnis liegt im dritten Parameter von PCIFetchInfo: OCI_RETURN_LOBS. Der dritte Parameter ist der FETCH-Modus. Bei OCI_RETURN_LOBS wird der LOB-Wert direkt in das Ergebnisarray anstelle des LOB-Locators eingefügt, sodass die Methode „load()“ des LOB-Objekts nicht erforderlich ist.
if (OCIFetchInto($stmt, $result, OCI_ASSOC+OCI_RETURN_LOBS))
{
echo "Content-type: " . StripSlashes($result[MIME]);
echo StripSlashes($result[PICTURE]);
}
OCIFreeStatement($stmt);
OCILogoff($conn);
?>
Dieses Programm wird verwendet, um im LOB platzierte Daten (Bilder) anzuzeigen. Aufrufende Methode (vorausgesetzt, der Skriptname lautet getpicture.php):
<IMG SRC="getpicture.php?pictureid=99" ALT="Bild in Oracle LOB platziert">
Die Abfrage
wurde bereits erwähnt, und das LOB-Feld von Oracle ist es LIKE kann nicht zum Matching verwendet werden. Was zu tun? Tatsächlich ist es nicht kompliziert. Oracle verfügt über ein anonymes Paket namens DBMS_LOB, das alle für den Betrieb von LOB erforderlichen Prozesse enthält.
Angenommen, Sie haben eine Tabelle wie diese:
TABELLE ARTIKEL ERSTELLEN (
ID-NUMMER,
TITEL VARCHAR2(100),
INHALT CLOB
);
Der Inhalt des Artikels wird im Feld CONTENT platziert.
Jetzt wollen wir alle Artikel finden, die „PHP-Chinese-Benutzer“ im Inhalt enthalten. Wir können es so machen:
<?php
$conn = OCILogon($user, $password, $SID);
//Die Prozedur DBMS_LOB.INSTR wird in der WHERE-Klausel verwendet. Es verfügt über vier Parameter, die den LOB-Locator darstellen (kann direkt durch ein Feld dargestellt werden), und die letzten beiden stellen den Startoffset und die Anzahl der Vorkommen dar. Es ist zu beachten, dass der Rückgabewert beurteilt werden muss, dh er muss größer als 0 sein.
$stmt = OCIParse($conn,"SELECT * FROM ARTICLES WHERE DBMS_LOB.INSTR(CONTENT, 'PHP Chinese User', 1, 1) > 0");
OCIExecute($stmt);
if (OCIFetchInto($stmt, $result, OCI_ASSOC+OCI_RETURN_LOBS))
{
...
}
OCIFreeStatement($stmt);
OCILogoff($conn);
?>
Oracle bietet auch viele Verfahren zum Bearbeiten von LOB-Daten wie LENGTH, SUBSTR usw. Informationen zur detaillierten Verwendung finden Sie im Entwicklungshandbuch von Oracle.
Hier dreht sich alles um die Operationen an LOB-Typdaten in der Oracle-Datenbank. Da ich schon lange keinen Kontakt mehr zu Oracle habe, kann es sein, dass sich in diesem Artikel Fehler eingeschlichen haben. Jeder kann mich gerne kritisieren und korrigieren.