Signatur
Beschreibung
odbc_procedurecolumns() liefert Informationen über die Ein- und Ausgabeparameter sowie Rückgabewerte von gespeicherten Prozeduren (Stored Procedures) in einer über ODBC angebundenen Datenquelle. Das Ergebnis kann verwendet werden, um die Parameterstruktur einer Prozedur dynamisch zu ermitteln, ohne das Datenbankschema manuell zu kennen.
Die Funktion gibt ein ODBC-Ergebnis-Handle zurück, das wie ein normales Abfrageergebnis mit odbc_fetch_row(), odbc_result() oder ähnlichen Funktionen ausgelesen werden kann. Jede Zeile des Ergebnisses beschreibt einen Parameter oder eine Ergebnis-Spalte der Prozedur.
Die zurückgegebenen Spalten folgen dem ODBC-Standard und umfassen u. a. PROCEDURE_CAT, PROCEDURE_SCHEM, PROCEDURE_NAME, COLUMN_NAME, COLUMN_TYPE (z. B. IN, OUT, INOUT), DATA_TYPE, TYPE_NAME, PRECISION, LENGTH, SCALE, NULLABLE und REMARKS.
Diese Funktion ist besonders nützlich für generische Datenbankwerkzeuge, ORMs oder Introspektions-Bibliotheken, die prozedurbasierte Datenbankzugriffe automatisieren sollen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $odbc Pflicht | resource | Eine gültige ODBC-Verbindungsressource, wie sie von odbc_connect() oder odbc_pconnect() zurückgegeben wird. |
|
| $catalog | ?string | null | Der Name des Katalogs (Datenbank) in der Datenquelle. Bei null oder leerem String wird kein Katalog-Filter angewendet (datenbankabhängig). |
| $schema | ?string | null | Das Datenbankschema, in dem die Prozedur liegt. Unterstützt je nach ODBC-Treiber Suchmuster mit % und _. |
| $procedure | ?string | null | Der Name der gespeicherten Prozedur. Unterstützt je nach ODBC-Treiber Suchmuster mit % und _. Bei null werden alle Prozeduren berücksichtigt. |
| $column | ?string | null | Der Name des Parameters bzw. der Spalte, nach dem gefiltert werden soll. Unterstützt Suchmuster. Bei null werden alle Parameter zurückgegeben. |
Rückgabewert
false zurückgegeben.Beispiele
Alle Parameter einer gespeicherten Prozedur auflisten
<?php
$conn = odbc_connect('MeineDSN', 'benutzer', 'geheim');
if (!$conn) {
die('Verbindung fehlgeschlagen');
}
// Parameter der Prozedur 'get_user_info' abfragen
$result = odbc_procedurecolumns($conn, null, null, 'get_user_info', null);
if ($result === false) {
die('Fehler beim Abrufen der Prozedurparameter');
}
while (odbc_fetch_row($result)) {
$colName = odbc_result($result, 'COLUMN_NAME');
$colType = odbc_result($result, 'COLUMN_TYPE'); // 1=IN, 2=INOUT, 3=Result, 4=?, 5=OUT
$dataType = odbc_result($result, 'TYPE_NAME');
$nullable = odbc_result($result, 'NULLABLE');
echo "Parameter: $colName | Typ: $colType | Datentyp: $dataType | Nullable: $nullable\n";
}
odbc_free_result($result);
odbc_close($conn);
Alle OUT-Parameter aller Prozeduren ermitteln
<?php
$conn = odbc_connect('MeineDSN', 'benutzer', 'geheim');
if (!$conn) {
die('Verbindung fehlgeschlagen');
}
// Alle Prozeduren im Schema 'dbo', alle Parameter
$result = odbc_procedurecolumns($conn, null, 'dbo', '%', '%');
if ($result === false) {
die('Fehler');
}
echo "OUT-Parameter:\n";
while (odbc_fetch_row($result)) {
$colType = odbc_result($result, 'COLUMN_TYPE');
// COLUMN_TYPE 5 = SQL_PARAM_OUTPUT
if ($colType == 5) {
$procName = odbc_result($result, 'PROCEDURE_NAME');
$colName = odbc_result($result, 'COLUMN_NAME');
$dataType = odbc_result($result, 'TYPE_NAME');
echo " Prozedur: $procName, Parameter: $colName ($dataType)\n";
}
}
odbc_free_result($result);
odbc_close($conn);
// Wichtig · Fallstricke
Treiber-Abhängigkeit: Das genaue Verhalten, die unterstützten Suchmuster sowie die Belegung von COLUMN_TYPE hängen stark vom verwendeten ODBC-Treiber ab. Nicht alle Treiber unterstützen alle Filtermöglichkeiten.
COLUMN_TYPE-Werte folgen dem ODBC-Standard: 0 = unbekannt, 1 = IN, 2 = INOUT, 3 = Ergebnisspalte, 4 = Rückgabewert, 5 = OUT.
Ab PHP 8.0 werden ODBC-Verbindungsressourcen intern als Objekte vom Typ Odbc\Connection und Ergebnisse als Odbc\Result behandelt, bleiben aber nach außen rückwärtskompatibel.
Ressourcen sollten nach der Verwendung stets mit odbc_free_result() freigegeben werden, um Speicher nicht unnötig zu belegen.