En estos ejemplos se realiza la conexión con el usuario HR, que es el esquema de ejemplo "Human Resources" proporcionado con la base de datos Oracle. Podría ser necesario desbloquear la cuenta y reiniciar la contraseña antes de poder usarla.
Los ejemplos se conectan a la base de datos XE de su máquina. Cambie la cadena de conexión a su base de datos antes de ejecutar los ejemplos.
Ejemplo #1 Consulta básica
Este ejemplo muestra la realización de consultas y la visualización de resultados. Las sentencias en OCI8 usan la secuencia de pasos 'preparación-ejecución-obtención'.
<?php
$conexión = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conexión) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
// Preparar la sentencia
$stid = oci_parse($conexión, 'SELECT * FROM departments');
if (!$stid) {
$e = oci_error($conexión);
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
// Realizar la lógica de la consulta
$r = oci_execute($stid);
if (!$r) {
$e = oci_error($stid);
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
// Obtener los resultados de la consulta
print "<table border='1'>\n";
while ($fila = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
print "<tr>\n";
foreach ($fila as $elemento) {
print " <td>" . ($elemento !== null ? htmlentities($elemento, ENT_QUOTES) : "") . "</td>\n";
}
print "</tr>\n";
}
print "</table>\n";
oci_free_statement($stid);
oci_close($conexión);
?>
Ejemplo #2 Inserción con variables vinculadas
Las variables vinculadas mejoran el rendimiento permitiendo la reutilización de contextos ejecutados y cachés. Las variables vinculadas mejoran la seguridad previniendo algunos tipos de problemas de Inyecciones SQL.
<?php
// Antes de ejecutarlo, cree la tabla:
// CREATE TABLE MYTABLE (mid NUMBER, myd VARCHAR2(20));
$conexión = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conexión) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$stid = oci_parse($conexión, 'INSERT INTO MYTABLE (mid, myd) VALUES(:myid, :mydata)');
$id = 60;
$datos = 'Algunos datos';
oci_bind_by_name($stid, ':myid', $id);
oci_bind_by_name($stid, ':mydata', $datos);
$r = oci_execute($stid); // ejecuta y consigna
if ($r) {
print "Una fila insertada";
}
oci_free_statement($stid);
oci_close($conexión);
?>
Ejemplo #3 Vincular la cláusula WHERE a una consulta
Lo siguiente muestra una vinculación escalar única.
<?php
$conn = oci_connect("hr", "hrpwd", "localhost/XE");
if (!$conn) {
$m = oci_error();
trigger_error(htmlentities($m['message']), E_USER_ERROR);
}
$sql = 'SELECT last_name FROM employees WHERE department_id = :didbv ORDER BY last_name';
$stid = oci_parse($conn, $sql);
$didbv = 60;
oci_bind_by_name($stid, ':didbv', $didbv);
oci_execute($stid);
while (($row = oci_fetch_array($stid, OCI_ASSOC)) != false) {
echo $row['LAST_NAME'] ."<br>\n";
}
// La salida es
// Austin
// Ernst
// Hunold
// Lorentz
// Pataballa
oci_free_statement($stid);
oci_close($conn);
?>
Ejemplo #4 Insertar datos en una columna CLOB
Para datos grandes use los tipos objeto grande binario (BLOB) u objeto grande de caracteres (CLOB). Este ejemplo usa CLOB.
<?php
// Antes de ejecutarlo, cree la tabla:
// CREATE TABLE MYTABLE (mykey NUMBER, myclob CLOB);
$conexión = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conexión) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$mykey = 12343; // clave arbitraria para este ejemplo;
$sql = "INSERT INTO mytable (mykey, myclob)
VALUES (:mykey, EMPTY_CLOB())
RETURNING myclob INTO :myclob";
$stid = oci_parse($conexión, $sql);
$clob = oci_new_descriptor($conexión, OCI_D_LOB);
oci_bind_by_name($stid, ":mykey", $mykey, 5);
oci_bind_by_name($stid, ":myclob", $clob, -1, OCI_B_CLOB);
oci_execute($stid, OCI_NO_AUTO_COMMIT); // utilice OCI_DEFAULT para PHP <= 5.3.1
$clob->save("Una cadena muy grande");
oci_commit($conexión);
// Obtener los datos CLOB
$consulta = 'SELECT myclob FROM mytable WHERE mykey = :mykey';
$stid = oci_parse ($conexión, $consulta);
oci_bind_by_name($stid, ":mykey", $mykey, 5);
oci_execute($stid);
print '<table border="1">';
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_LOBS)) {
print '<tr><td>'.$row['MYCLOB'].'</td></tr>';
// En un bucle, liberar la variable grande antes de la 2ª obtención reduce el uso de memoria de picos de PHP
unset($row);
}
print '</table>';
?>
Ejemplo #5 Usar una función almacenada de PL/SQL
Se debe vincular una variable para el valor de retorno y, opcionalmente, para cualquier argumento de la función de PL/SQL.
<?php
/*
Antes de ejecutar el programa de PHP, cree una función almacenada en
SQL*Plus o SQL Developer:
CREATE OR REPLACE FUNCTION myfunc(p IN NUMBER) RETURN NUMBER AS
BEGIN
RETURN p * 3;
END;
*/
$conexión = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conexión) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$p = 8;
$stid = oci_parse($conexión, 'begin :r := myfunc(:p); end;');
oci_bind_by_name($stid, ':p', $p);
oci_bind_by_name($stid, ':r', $r, 40);
oci_execute($stid);
print "$r\n"; // imprime 24
oci_free_statement($stid);
oci_close($conexión);
?>
Ejemplo #6 Utilizar un procedimiento almacenado de PL/SQL
Con los procedimientos almacenados se deberían vincular variables para cualquier argumento.
<?php
/*
Antes de ejecutar el programa de PHP, cree un procedimiento almacenado en
SQL*Plus or SQL Developer:
CREATE OR REPLACE PROCEDURE myproc(p1 IN NUMBER, p2 OUT NUMBER) AS
BEGIN
p2 := p1 * 2;
END;
*/
$conexión = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conexión) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$p1 = 8;
$stid = oci_parse($conexión, 'begin myproc(:p1, :p2); end;');
oci_bind_by_name($stid, ':p1', $p1);
oci_bind_by_name($stid, ':p2', $p2, 40);
oci_execute($stid);
print "$p2\n"; // imprime 16
oci_free_statement($stid);
oci_close($conexión);
?>
Ejemplo #7 Llamar a una función de PL/SQL que devuelve un REF CURSOR
Cada valor devuelto por la consulta es un REF CURSOR desde el que se pueden obtener datos.
<?php
/*
Cree una función almacenada de PL/SQL como:
CREATE OR REPLACE FUNCTION myfunc(p1 IN NUMBER) RETURN SYS_REFCURSOR AS
rc SYS_REFCURSOR;
BEGIN
OPEN rc FOR SELECT city FROM locations WHERE ROWNUM < p1;
RETURN rc;
END;
*/
$conexión = oci_connect('hr', 'welcome', 'localhost/XE');
$stid = oci_parse($conexión, 'SELECT myfunc(5) AS mfrc FROM dual');
oci_execute($stid);
echo "<table border='1'>\n";
while (($fila = oci_fetch_array($stid, OCI_ASSOC))) {
echo "<tr>\n";
$rc = $fila['MFRC'];
oci_execute($rc); // el valor de la columna devuelta por la consulta es un ref cursor
while (($fila_rc = oci_fetch_array($rc, OCI_ASSOC))) {
echo " <td>" . $fila_rc['CITY'] . "</td>\n";
}
oci_free_statement($rc);
echo "</tr>\n";
}
echo "</table>\n";
// La salida es:
// Beijing
// Bern
// Bombay
// Geneva
oci_free_statement($stid);
oci_close($conexión);
?>