Signatur
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
"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);
?>
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).