Start · Sprachen · PHP · Referenz · oci_define_by_name

oci_define_by_name

Funktion

Verknüpft eine PHP-Variable mit einer Spalte für Abfrageergebnisse, sodass sie nach <code>oci_fetch()</code> automatisch den Spaltenwert enthält.

seit PHP 5.0.0 Kategorie: db

Signatur

oci_define_by_name(resource $statement, string $column_name, mixed &$variable, int $type = 0): bool

Beschreibung

oci_define_by_name() bindet eine PHP-Variable an eine benannte Spalte eines OCI-Ergebnissatzes. Nach dem Ausführen der Abfrage mit oci_execute() wird die Variable bei jedem Aufruf von oci_fetch() automatisch mit dem aktuellen Spaltenwert aktualisiert. Dies ist besonders nützlich, wenn man Zeile für Zeile verarbeiten möchte, ohne Hilfsfunktionen wie oci_fetch_assoc() zu verwenden.

Der Spaltenname ($column_name) muss in Großbuchstaben angegeben werden, da Oracle intern alle nicht in Anführungszeichen gesetzten Bezeichner in Großschreibung umwandelt. Bei Spalten, die in der SQL-Abfrage mit einem Alias definiert wurden, muss der Aliasname verwendet werden.

Der optionale Parameter $type erlaubt es, den Datentyp der Variable explizit festzulegen – beispielsweise SQLT_CHR für Zeichenketten oder OCI_B_CLOB für CLOB-Werte. Für normale Spalten ist der Standardwert 0 (automatische Erkennung) ausreichend.

Diese Funktion muss vor dem Aufruf von oci_execute() aufgerufen werden, damit die Bindung korrekt eingerichtet wird. Sie eignet sich besonders bei der Verarbeitung großer Ergebnismengen, da keine assoziativen Arrays alloziert werden müssen.

Parameter

Name Typ Default Beschreibung
$statement Pflicht resource Ein gültiges OCI-Statement-Handle, das durch oci_parse() erzeugt wurde.
$column_name Pflicht string Name der Spalte im Ergebnissatz, wie er in der SQL-Abfrage definiert ist – in Großbuchstaben. Bei Aliasnamen ebenfalls den Alias in Großbuchstaben angeben.
$variable Pflicht mixed Die PHP-Variable (als Referenz), die mit dem Spaltenwert befüllt wird. Nach jedem oci_fetch()-Aufruf enthält sie den aktuellen Zeilenwert.
$type int 0 Optionaler OCI-Datentyp der Spalte. Standardmäßig 0 (automatisch). Für LOB-Spalten z. B. OCI_B_CLOB oder OCI_B_BLOB angeben.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück. Im Fehlerfall (z. B. ungültiges Statement-Handle) wird false zurückgegeben.

Beispiele

Einfache Spaltenbindung und zeilenweise Verarbeitung

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

$sql = 'SELECT mitarbeiter_id, vorname, nachname FROM mitarbeiter ORDER BY nachname';
$stmt = oci_parse($conn, $sql);

// Variablen vor oci_execute() binden
oci_define_by_name($stmt, 'MITARBEITER_ID', $id);
oci_define_by_name($stmt, 'VORNAME',        $vorname);
oci_define_by_name($stmt, 'NACHNAME',       $nachname);

oci_execute($stmt);

while (oci_fetch($stmt)) {
    echo "ID: $id | Name: $vorname $nachname\n";
}

oci_free_statement($stmt);
oci_close($conn);
ID: 1 | Name: Anna Bauer ID: 2 | Name: Karl Müller ...

Alias-Spalte und expliziter Datentyp

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

// Spalte mit Alias definieren
$sql = 'SELECT abteilung_id, COUNT(*) AS anzahl FROM mitarbeiter GROUP BY abteilung_id';
$stmt = oci_parse($conn, $sql);

// Alias-Name in GROSSBUCHSTABEN verwenden
oci_define_by_name($stmt, 'ABTEILUNG_ID', $abtId);
oci_define_by_name($stmt, 'ANZAHL',       $anzahl, SQLT_INT);

oci_execute($stmt);

while (oci_fetch($stmt)) {
    echo "Abteilung $abtId hat $anzahl Mitarbeiter.\n";
}

oci_free_statement($stmt);
oci_close($conn);
Abteilung 10 hat 5 Mitarbeiter. Abteilung 20 hat 3 Mitarbeiter. ...

// Wichtig · Fallstricke

Reihenfolge beachten: oci_define_by_name() muss vor oci_execute() aufgerufen werden, andernfalls werden die Bindings ignoriert und die Variablen nicht befüllt.

Groß-/Kleinschreibung: Oracle wandelt Spaltennamen intern in Großbuchstaben um. Der Parameter $column_name muss daher immer in Großbuchstaben übergeben werden, sonst schlägt die Bindung stillschweigend fehl.

LOB-Spalten: Bei CLOB- oder BLOB-Spalten sollte der Typ explizit als OCI_B_CLOB bzw. OCI_B_BLOB angegeben werden, und die gebundene Variable wird als OCI-LOB-Objekt befüllt, das mit ->load() ausgelesen werden kann.

Diese Funktion ist Teil der OCI8-Erweiterung und erfordert, dass PHP mit --with-oci8 kompiliert wurde oder die Erweiterung über extension=oci8 in der php.ini aktiviert ist.