Start · Sprachen · PHP · Referenz · oci_field_type

oci_field_type

Funktion

Gibt den Datentypnamen eines Feldes (Spalte) aus einem OCI-Statement-Ergebnis zurück.

seit PHP 5.0.0 Kategorie: db

Signatur

oci_field_type(resource $statement, string|int $column): string|false

Beschreibung

oci_field_type() ermittelt den Oracle-Datentypnamen einer bestimmten Spalte im Ergebnis eines ausgeführten OCI-Statements. Die Funktion ist besonders nützlich, wenn zur Laufzeit die Struktur einer Ergebnismenge unbekannt ist und dynamisch auf Spalteneigenschaften reagiert werden muss.

Der Rückgabewert ist ein String wie "NUMBER", "VARCHAR2", "DATE", "CLOB", "BLOB" oder "RAW". Diese Typbezeichnungen entsprechen den Oracle-eigenen Datentypnamen und unterscheiden sich von PHP-internen Typen.

Die Spalte kann entweder über ihren Namen (String) oder über ihre 1-basierte Position (Integer) adressiert werden. Das Statement muss zuvor mit oci_execute() ausgeführt worden sein, damit Metainformationen verfügbar sind.

Typische Einsatzszenarien sind generische Datenbankabstraktionsschichten, automatische Formulargeneration basierend auf Spaltentypen sowie das dynamische Verarbeiten von BLOB- oder CLOB-Feldern, bei denen eine gesonderte Behandlung erforderlich ist.

Parameter

Name Typ Default Beschreibung
$statement Pflicht resource Ein gültiges OCI-Statement-Handle, das zuvor mit oci_parse() erstellt und mit oci_execute() ausgeführt wurde.
$column Pflicht string|int Der Name der Spalte (Groß-/Kleinschreibung wird ignoriert) oder die 1-basierte Position der Spalte im Ergebnis-Set.

Rückgabewert

Typ
string|false
Beschreibung
Gibt den Oracle-Datentypnamen der Spalte als String zurück (z. B. "VARCHAR2", "NUMBER", "DATE", "CLOB", "BLOB"). Bei einem Fehler wird false zurückgegeben.

Beispiele

Spaltentypinformationen einer Abfrage ausgeben

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

$sql = 'SELECT employee_id, first_name, hire_date, salary FROM employees WHERE ROWNUM <= 1';
$stmt = oci_parse($conn, $sql);
oci_execute($stmt);

$numCols = oci_num_fields($stmt);
for ($i = 1; $i <= $numCols; $i++) {
    $fieldName = oci_field_name($stmt, $i);
    $fieldType = oci_field_type($stmt, $i);
    echo "Spalte $i: $fieldName -> Typ: $fieldType\n";
}

oci_free_statement($stmt);
oci_close($conn);
?>
Spalte 1: EMPLOYEE_ID -> Typ: NUMBER Spalte 2: FIRST_NAME -> Typ: VARCHAR2 Spalte 3: HIRE_DATE -> Typ: DATE Spalte 4: SALARY -> Typ: NUMBER

CLOB- und BLOB-Felder dynamisch erkennen und gesondert behandeln

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

$sql = 'SELECT document_id, document_name, document_content FROM documents WHERE ROWNUM <= 5';
$stmt = oci_parse($conn, $sql);
oci_execute($stmt);

$numCols = oci_num_fields($stmt);

while (oci_fetch($stmt)) {
    for ($i = 1; $i <= $numCols; $i++) {
        $type = oci_field_type($stmt, $i);
        $name = oci_field_name($stmt, $i);
        $value = oci_result($stmt, $i);

        if (in_array($type, ['CLOB', 'BLOB', 'NCLOB'])) {
            // LOB-Objekt separat lesen
            echo "$name ($type): [LOB-Daten, Größe: " . strlen($value->load()) . " Bytes]\n";
        } else {
            echo "$name ($type): $value\n";
        }
    }
    echo "---\n";
}

oci_free_statement($stmt);
oci_close($conn);
?>

// Wichtig · Fallstricke

Voraussetzung: Das Statement muss mit oci_execute() ausgeführt worden sein, bevor oci_field_type() aufgerufen wird. Ohne vorherige Ausführung ist kein Zugriff auf Metadaten möglich.

Spaltennamen: Werden Spaltennamen als String übergeben, werden diese intern in Großbuchstaben umgewandelt. Oracle gibt Spaltennamen standardmäßig in Großschreibung zurück, sofern sie nicht in Anführungszeichen definiert wurden.

LOB-Typen: Für CLOB-, BLOB- und NCLOB-Felder wird ein OCI-LOB-Deskriptor zurückgegeben, nicht direkt ein String. Mit oci_field_type() lässt sich der Typ vorab prüfen, um die korrekte Verarbeitung sicherzustellen.

Die Funktion ist Teil der OCI8-Erweiterung und erfordert, dass PHP mit Oracle-Unterstützung kompiliert wurde (--with-oci8).