Ejemplos

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($stidOCI_ASSOC+OCI_RETURN_NULLS)) {
    print 
"<tr>\n";
    foreach (
$fila as $elemento) {
        print 
"    <td>" . ($elemento !== null htmlentities($elementoENT_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($stidOCI_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ónOCI_D_LOB);
oci_bind_by_name($stid":mykey"$mykey5);
oci_bind_by_name($stid":myclob"$clob, -1OCI_B_CLOB);
oci_execute($stidOCI_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"$mykey5);
oci_execute($stid);

print 
'<table border="1">';
while (
$row oci_fetch_array($stidOCI_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'$r40);

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'$p240);

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($stidOCI_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($rcOCI_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);

?>