Start · Sprachen · PHP · Referenz · oci_lob_is_equal

oci_lob_is_equal

Funktion

Vergleicht zwei <code>OCILob</code>-Locators auf Gleichheit und gibt <code>true</code> zurück, wenn beide auf dasselbe LOB/FILE-Objekt in der Datenbank zeigen.

seit PHP 5.0.0 Kategorie: db

Signatur

oci_lob_is_equal(OCILob $lob1, OCILob $lob2): bool

Beschreibung

oci_lob_is_equal() prüft, ob zwei OCILob-Objekte (Large Objects) auf exakt denselben LOB-Locator in der Oracle-Datenbank verweisen. Ein LOB-Locator ist ein interner Zeiger auf ein großes Objekt (z. B. CLOB, BLOB oder BFILE), das in einer Oracle-Datenbank gespeichert ist. Zwei Locators gelten als gleich, wenn sie auf dieselbe physische LOB-Instanz verweisen – nicht notwendigerweise dann, wenn ihr Inhalt identisch ist.

Diese Funktion ist nützlich, wenn man mehrere LOB-Referenzen aus verschiedenen Abfragen oder aus unterschiedlichen Teilen einer Anwendung besitzt und sicherstellen möchte, dass man nicht versehentlich dasselbe Objekt doppelt verarbeitet oder modifiziert. Sie arbeitet auf der Ebene der Datenbankzeiger und nicht auf dem eigentlichen Inhalt der LOBs.

Die Funktion gehört zur OCI8-Extension, die für die Kommunikation mit Oracle-Datenbanken zuständig ist. Sie erfordert gültige, nicht freigegebene OCILob-Instanzen. Beide Parameter müssen aus einer aktiven Oracle-Verbindung stammen.

Parameter

Name Typ Default Beschreibung
$lob1 Pflicht OCILob Der erste LOB-Locator, der verglichen werden soll. Muss ein gültiges OCILob-Objekt sein, das aus einer Oracle-Abfrage stammt.
$lob2 Pflicht OCILob Der zweite LOB-Locator, der verglichen werden soll. Muss ebenfalls ein gültiges OCILob-Objekt sein, das aus einer Oracle-Abfrage stammt.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn beide LOB-Locators auf dasselbe Datenbankobjekt zeigen, andernfalls false. Zeigen die Locators auf verschiedene LOB-Instanzen – auch wenn ihr Inhalt identisch wäre –, wird false zurückgegeben.

Beispiele

Zwei LOB-Locators aus derselben Zeile vergleichen

<?php
$conn = oci_connect('benutzer', 'passwort', 'localhost/XE');

// Erste Abfrage: Locator für denselben CLOB-Wert zweimal laden
$sql = 'SELECT inhalt FROM dokumente WHERE id = 1';
$stmt1 = oci_parse($conn, $sql);
$stmt2 = oci_parse($conn, $sql);

$clob1 = oci_new_descriptor($conn, OCI_D_LOB);
$clob2 = oci_new_descriptor($conn, OCI_D_LOB);

oci_define_by_name($stmt1, 'INHALT', $clob1, OCI_B_CLOB);
oci_define_by_name($stmt2, 'INHALT', $clob2, OCI_B_CLOB);

oci_execute($stmt1, OCI_DEFAULT);
oci_execute($stmt2, OCI_DEFAULT);

oci_fetch($stmt1);
oci_fetch($stmt2);

if (oci_lob_is_equal($clob1, $clob2)) {
    echo "Beide Locators zeigen auf dasselbe LOB-Objekt.\n";
} else {
    echo "Die Locators sind verschieden.\n";
}

$clob1->free();
$clob2->free();
oci_free_statement($stmt1);
oci_free_statement($stmt2);
oci_close($conn);
?>
Die Locators sind verschieden.

Denselben Locator mit sich selbst vergleichen

<?php
$conn = oci_connect('benutzer', 'passwort', 'localhost/XE');

$sql = 'SELECT inhalt FROM dokumente WHERE id = 1';
$stmt = oci_parse($conn, $sql);

$clob = oci_new_descriptor($conn, OCI_D_LOB);
oci_define_by_name($stmt, 'INHALT', $clob, OCI_B_CLOB);
oci_execute($stmt, OCI_DEFAULT);
oci_fetch($stmt);

// Denselben Locator mit sich selbst vergleichen
if (oci_lob_is_equal($clob, $clob)) {
    echo "Ein Locator ist immer gleich mit sich selbst.\n";
}

$clob->free();
oci_free_statement($stmt);
oci_close($conn);
?>
Ein Locator ist immer gleich mit sich selbst.

// Wichtig · Fallstricke

Inhalt vs. Locator: oci_lob_is_equal() vergleicht nicht den tatsächlichen Inhalt zweier LOBs. Zwei LOBs mit identischem Text können trotzdem als ungleich gelten, wenn sie verschiedene Datenbankzeiger sind. Für einen Inhaltsvergleich müsste man die LOB-Daten explizit laden und vergleichen.

Veraltete Methode: Ab PHP 8.0 ist die objektorientierte OCI8-API bevorzugt. Die Methode OCILob::isEqual() kann alternativ verwendet werden und ist semantisch identisch.

Ressourcenverwaltung: Stets sicherstellen, dass LOB-Deskriptoren nach der Verwendung mit OCILob::free() freigegeben werden, um Speicherlecks zu vermeiden.