Signatur
Beschreibung
oci_set_edition() legt die Oracle-Edition fest, die für alle nachfolgenden OCI8-Verbindungen verwendet wird. Oracle-Editionen (Edition-Based Redefinition, kurz EBR) ermöglichen es, mehrere Versionen von Datenbankobjekten wie Stored Procedures, Views oder Packages gleichzeitig in einer Datenbank zu betreiben, ohne den laufenden Betrieb zu unterbrechen.
Die Funktion muss vor dem Aufbau einer Datenbankverbindung (also vor oci_connect(), oci_pconnect() oder oci_new_connect()) aufgerufen werden. Eine nachträgliche Änderung der Edition für bereits bestehende Verbindungen ist nicht möglich. Wird sie nach dem Verbindungsaufbau aufgerufen, hat sie keine Wirkung auf bestehende Verbindungen.
Typische Anwendungsfälle sind Zero-Downtime-Deployments, bei denen eine neue Version einer Anwendung mit einer neuen Edition der PL/SQL-Objekte ausgeliefert wird, während die alte Edition weiterhin für bestehende Sessions aktiv bleibt. So können beide Versionen parallel betrieben werden.
Diese Funktion ist nur verfügbar, wenn PHP gegen Oracle Database 11g Release 2 oder neuer kompiliert wurde und gegen eine entsprechende Client-Bibliothek gelinkt ist. Die zu setzende Edition muss in der Oracle-Datenbank zuvor mit CREATE EDITION angelegt worden sein.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $edition Pflicht | string | Der Name der Oracle-Edition, die für nachfolgende Verbindungen verwendet werden soll. Der Name muss einer in der Oracle-Datenbank vorhandenen Edition entsprechen, die zuvor mit CREATE EDITION angelegt wurde. |
Rückgabewert
true bei Erfolg zurück, oder false bei einem Fehler (z. B. wenn die Funktion nach dem Verbindungsaufbau aufgerufen wird oder die Edition einen ungültigen Wert hat).Beispiele
Edition vor dem Verbindungsaufbau setzen
<?php
// Edition setzen, BEVOR eine Verbindung aufgebaut wird
$success = oci_set_edition('MY_APP_V2');
if ($success) {
echo "Edition erfolgreich gesetzt.\n";
} else {
echo "Fehler beim Setzen der Edition.\n";
}
// Verbindung aufbauen – diese verwendet nun die Edition MY_APP_V2
$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlspecialchars($e['message']), E_USER_ERROR);
}
// Aktuelle Edition der Session abfragen
$stid = oci_parse($conn, "SELECT SYS_CONTEXT('USERENV', 'CURRENT_EDITION_NAME') FROM dual");
oci_execute($stid);
$row = oci_fetch_array($stid, OCI_ASSOC);
echo "Aktive Edition: " . $row["SYS_CONTEXT('USERENV','CURRENT_EDITION_NAME')"] . "\n";
oci_free_statement($stid);
oci_close($conn);
Zero-Downtime-Deployment mit unterschiedlichen Editionen
<?php
// Simuliertes Zero-Downtime-Deployment:
// Alte Anfragen nutzen Edition V1, neue Anfragen nutzen Edition V2
$requestVersion = isset($_GET['version']) ? $_GET['version'] : 'V1';
$edition = ($requestVersion === 'V2') ? 'MY_APP_V2' : 'MY_APP_V1';
if (!oci_set_edition($edition)) {
die('Fehler: Edition konnte nicht gesetzt werden.');
}
$conn = oci_connect('appuser', 'apppassword', 'dbhost/ORCL');
if (!$conn) {
$e = oci_error();
trigger_error(htmlspecialchars($e['message']), E_USER_ERROR);
}
// Stored Procedure aufrufen – abhängig von der aktiven Edition
// wird die entsprechende Version der Prozedur ausgeführt
$stid = oci_parse($conn, 'BEGIN get_product_info(:product_id, :result); END;');
oci_bind_by_name($stid, ':product_id', $productId);
oci_bind_by_name($stid, ':result', $result, 200);
$productId = 42;
oci_execute($stid);
echo "Ergebnis (Edition {$edition}): " . $result . "\n";
oci_free_statement($stid);
oci_close($conn);
// Wichtig · Fallstricke
Reihenfolge beachten: oci_set_edition() muss zwingend vor jeglichem Verbindungsaufbau aufgerufen werden. Bei persistenten Verbindungen (oci_pconnect()) kann die Edition einer bereits gecachten Verbindung nicht im Nachhinein geändert werden – die gecachte Verbindung behält ihre ursprüngliche Edition.
Voraussetzungen: Die Funktion steht nur zur Verfügung, wenn PHP mit Oracle 11g Release 2 (11.2) oder neuer kompiliert wurde. Die angegebene Edition muss in der Zieldatenbank existieren und der verbindende Datenbankbenutzer muss das USE-Privileg auf der Edition besitzen.
Globale Wirkung: Der Aufruf wirkt sich global auf alle nachfolgenden Verbindungen im aktuellen PHP-Prozess aus, nicht nur auf eine einzelne Verbindung. In Umgebungen mit Connection-Pooling (z. B. DRCP) sollte diese Funktion mit besonderer Sorgfalt eingesetzt werden.