Sei sulla pagina 1di 6

Conexin de php con pl/sql

En estos ejemplos se realiza la conexin con el usuario HR, que es el esquema de ejemplo
"Human Resources" proporcionado con la base de datos Oracle. Podra ser necesario
desbloquear la cuenta y reiniciar la contrasea antes de poder usarla.
Los ejemplos se conectan a la base de datos XE de su mquina. Cambie la cadena de
conexin a su base de datos antes de ejecutar los ejemplos.
Ejemplo #1 Consulta bsica
Este ejemplo muestra la realizacin de consultas y la visualizacin de resultados. Las
sentencias en OCI8 usan la secuencia de pasos 'preparacin-ejecucin-obtencin'.
<?php
$conexin = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conexin) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
// Preparar la sentencia
$stid = oci_parse($conexin, 'SELECT * FROM departments');
if (!$stid) {
$e = oci_error($conexin);
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
// Realizar la lgica 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($conexin);
?>

Ejemplo #2 Insercin con variables vinculadas


Las variables vinculadas mejoran el rendimiento permitiendo la reutilizacin de contextos
ejecutados y cachs. 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));
$conexin = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conexin) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$stid = oci_parse($conexin, '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($conexin);
?>

Ejemplo #3 Vincular la clusula WHERE a una consulta


Lo siguiente muestra una vinculacin 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 ORDE
R 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);
$conexin = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conexin) {
$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($conexin, $sql);
$clob = oci_new_descriptor($conexin, 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($conexin);
// Obtener los datos CLOB
$consulta = 'SELECT myclob FROM mytable WHERE mykey = :mykey';
$stid = oci_parse ($conexin, $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 obtencin r
educe el uso de memoria de picos de PHP
unset($row);
}
print '</table>';
?>

Ejemplo #5 Usar una funcin almacenada de PL/SQL


Se debe vincular una variable para el valor de retorno y, opcionalmente, para cualquier
argumento de la funcin de PL/SQL.
<?php
/*
Antes de ejecutar el programa de PHP, cree una funcin almacenada en
SQL*Plus o SQL Developer:
CREATE OR REPLACE FUNCTION myfunc(p IN NUMBER) RETURN NUMBER AS
BEGIN
RETURN p * 3;
END;
*/
$conexin = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conexin) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$p = 8;
$stid = oci_parse($conexin, '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($conexin);
?>

Ejemplo #6 Utilizar un procedimiento almacenado de PL/SQL

Con los procedimientos almacenados se deberan 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;
*/
$conexin = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conexin) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$p1 = 8;
$stid = oci_parse($conexin, '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($conexin);
?>

Ejemplo #7 Llamar a una funcin 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 funcin 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;

$conexin = oci_connect('hr', 'welcome', 'localhost/XE');


$stid = oci_parse($conexin, '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($conexin);
?>

Potrebbero piacerti anche