Start · Sprachen · PHP · Referenz · oci_num_rows

oci_num_rows

Funktion

Gibt die Anzahl der von einer OCI8-Statement-Ausführung betroffenen Zeilen (z. B. bei <code>INSERT</code>, <code>UPDATE</code>, <code>DELETE</code>) zurück.

seit PHP 5.0.0 Kategorie: db

Signatur

oci_num_rows(resource $statement): int|false

Beschreibung

oci_num_rows() liefert die Anzahl der Zeilen, die durch das zuletzt ausgeführte SQL-Statement tatsächlich verändert wurden. Die Funktion ist besonders nützlich nach DML-Operationen wie INSERT, UPDATE oder DELETE, um zu prüfen, ob und wie viele Datensätze betroffen waren.

Wichtig: Bei SELECT-Statements gibt oci_num_rows() nicht die Anzahl der gefundenen Ergebniszeilen zurück. Für diesen Zweck muss man alle Zeilen abrufen und selbst zählen, da Oracle ergebnisbasierte Cursor-Abfragen inkrementell verarbeitet.

Die Funktion wird typischerweise nach einem erfolgreichen Aufruf von oci_execute() eingesetzt. Gibt false zurück, wenn das übergebene Statement-Handle ungültig ist oder ein Fehler aufgetreten ist.

  • Geeignet für DML-Statements: INSERT, UPDATE, DELETE, MERGE
  • Nicht geeignet, um die Ergebnisanzahl von SELECT-Abfragen zu ermitteln

Parameter

Name Typ Default Beschreibung
$statement Pflicht resource Ein gültiges OCI8-Statement-Handle, das mit oci_parse() erzeugt und mit oci_execute() ausgeführt wurde.

Rückgabewert

Typ
int|false
Beschreibung
Gibt die Anzahl der betroffenen Zeilen als Integer zurück. Gibt false zurück, wenn ein Fehler aufgetreten ist oder das Statement-Handle ungültig ist.

Beispiele

Anzahl gelöschter Zeilen ermitteln

<?php
$conn = oci_connect('benutzer', 'passwort', 'localhost/XE');
if (!$conn) {
    $e = oci_error();
    trigger_error(htmlspecialchars($e['message']), E_USER_ERROR);
}

$sql = "DELETE FROM bestellungen WHERE status = 'storniert'";
$stmt = oci_parse($conn, $sql);
oci_execute($stmt);

$anzahl = oci_num_rows($stmt);
echo "Gelöschte Datensätze: " . $anzahl . PHP_EOL;

oci_commit($conn);
oci_free_statement($stmt);
oci_close($conn);
?>
Gelöschte Datensätze: 3

Überprüfen, ob ein UPDATE tatsächlich Zeilen verändert hat

<?php
$conn = oci_connect('benutzer', 'passwort', 'localhost/XE');
if (!$conn) {
    $e = oci_error();
    trigger_error(htmlspecialchars($e['message']), E_USER_ERROR);
}

$sql = "UPDATE produkte SET preis = preis * 1.05 WHERE kategorie = :kat";
$stmt = oci_parse($conn, $sql);
$kategorie = 'Elektronik';
oci_bind_by_name($stmt, ':kat', $kategorie);
oci_execute($stmt);

$betroffene = oci_num_rows($stmt);
if ($betroffene > 0) {
    echo "Preise von {$betroffene} Produkt(en) wurden aktualisiert." . PHP_EOL;
    oci_commit($conn);
} else {
    echo "Keine Produkte in dieser Kategorie gefunden." . PHP_EOL;
    oci_rollback($conn);
}

oci_free_statement($stmt);
oci_close($conn);
?>
Preise von 7 Produkt(en) wurden aktualisiert.

// Wichtig · Fallstricke

Achtung bei SELECT-Statements: oci_num_rows() gibt bei SELECT-Abfragen nicht die Gesamtanzahl der Ergebniszeilen zurück. Stattdessen wird nur die Anzahl der bisher abgerufenen Zeilen zurückgeliefert, was zu irreführenden Ergebnissen führen kann. Für SELECT COUNT(*)-Abfragen sollte stattdessen der Wert direkt aus dem Ergebnis gelesen werden.

Die Funktion ist Teil der OCI8-Erweiterung und steht nur zur Verfügung, wenn PHP mit Oracle-Unterstützung kompiliert wurde (--with-oci8). Ohne diese Erweiterung führt der Aufruf zu einem fatalen Fehler.