Start · Sprachen · PHP · Referenz · oci_parse

oci_parse

Funktion

Bereitet ein Oracle-Statement zur Ausführung vor und gibt ein Statement-Handle zurück.

seit PHP 5.0.0 Kategorie: db

Signatur

oci_parse(resource $connection, string $sql): resource|false

Beschreibung

oci_parse() analysiert eine SQL- oder PL/SQL-Anweisung und erstellt daraus ein Statement-Handle, das für spätere Ausführungen mit oci_execute() oder das Binden von Variablen mit oci_bind_by_name() verwendet werden kann. Die Funktion sendet die Anweisung dabei noch nicht an die Datenbank — es findet lediglich eine clientseitige Vorbereitung statt.

Typischerweise setzt man oci_parse() ein, wenn man parametrisierte Abfragen aufbauen möchte, indem man zunächst das Statement mit Platzhaltern (z. B. :id) parst, dann mit oci_bind_by_name() konkrete Werte daran bindet und schließlich mit oci_execute() ausführt. Dieses Muster verhindert SQL-Injection und ermöglicht effizientes Wiederausführen derselben Anweisung mit unterschiedlichen Parametern.

Das zurückgegebene Statement-Handle muss nach Abschluss aller Operationen mit oci_free_statement() freigegeben werden, um Ressourcen auf der Oracle-Seite nicht unnötig zu belegen. Wird dasselbe Statement mehrfach mit neuen Bindungen ausgeführt, genügt ein einmaliger Aufruf von oci_parse().

Parameter

Name Typ Default Beschreibung
$connection Pflicht resource Eine aktive Oracle-Verbindungsressource, die zuvor mit oci_connect(), oci_pconnect() oder oci_new_connect() erstellt wurde.
$sql Pflicht string Die SQL- oder PL/SQL-Anweisung als Zeichenkette. Für Bindeparameter werden benannte Platzhalter in der Form :name verwendet. Semikolons am Ende von einzelnen SQL-Anweisungen werden weggelassen; PL/SQL-Blöcke enden hingegen mit einem Semikolon.

Rückgabewert

Typ
resource|false
Beschreibung
Gibt im Erfolgsfall eine Statement-Ressource zurück, die für weitere Operationen (Binden, Ausführen, Abrufen) genutzt werden kann. Bei einem Fehler wird false zurückgegeben.

Beispiele

Einfaches SELECT mit Bind-Variable

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

$sql = 'SELECT vorname, nachname FROM mitarbeiter WHERE abteilung_id = :abt_id';
$stmt = oci_parse($conn, $sql);

$abtId = 5;
oci_bind_by_name($stmt, ':abt_id', $abtId);
oci_execute($stmt);

while ($row = oci_fetch_assoc($stmt)) {
    echo $row['VORNAME'] . ' ' . $row['NACHNAME'] . PHP_EOL;
}

oci_free_statement($stmt);
oci_close($conn);
Max Mustermann Erika Musterfrau

Mehrfaches Ausführen derselben INSERT-Anweisung

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

$sql = 'INSERT INTO protokoll (nachricht, erstellt_am) VALUES (:msg, SYSDATE)';
$stmt = oci_parse($conn, $sql);

$nachrichten = ['Login erfolgreich', 'Datei hochgeladen', 'Logout'];
foreach ($nachrichten as $msg) {
    oci_bind_by_name($stmt, ':msg', $msg);
    // OCI_NO_AUTO_COMMIT: Transaktion offen halten
    oci_execute($stmt, OCI_NO_AUTO_COMMIT);
}

oci_commit($conn);
oci_free_statement($stmt);
oci_close($conn);

echo 'Alle Einträge erfolgreich gespeichert.';
Alle Einträge erfolgreich gespeichert.

// Wichtig · Fallstricke

SQL-Injection: Verwende niemals direkte Stringkonkatenation mit Benutzereingaben in der SQL-Anweisung. Nutze stets Bind-Variablen via oci_bind_by_name(), um SQL-Injection zu verhindern.

PL/SQL-Blöcke: Anonyme PL/SQL-Blöcke (BEGIN ... END;) sowie gespeicherte Prozeduraufrufe werden ebenfalls mit oci_parse() vorbereitet. Hier ist das abschließende Semikolon innerhalb des Strings erforderlich.

Ressourcenverwaltung: Jede mit oci_parse() erzeugte Ressource belegt serverseitige Oracle-Cursor. Bei vielen Statements ohne oci_free_statement() kann das Limit offener Cursor (OPEN_CURSORS) in Oracle erreicht werden, was zu Fehlern führt.

Fehlerbehandlung: Im Fehlerfall liefert oci_parse() false. Detaillierte Fehlermeldungen sind über oci_error($connection) abrufbar.