|
XCVIII. Funciones de Oracle
Estas funciones le permiten acceder a bases de datos Oracle 10,
Oracle 9, Oracle 8 y Oracle 7 usando la Interfaz de Llamados
Oracle (OCI por sus siglas en Inglés). Ellas soportan la
vinculación de variables PHP a recipientes Oracle, tienen
soporte completo LOB, FILE y ROWID, y le permiten usar variables
de definición entregadas por el usuario.
Es necesario contar con las bibliotecas de cliente Oracle para
usar esta extensión. Los usuarios de Windows
necesitarán bibliotecas con una versión de al menos
10 para usar php_oci8.dll.
La forma más conveniente de instalar todos los archivos
requeridos es usar el Cliente Instantáneo de Oracle, que
está disponible en: http://www.oracle.com/technology/tech/oci/instantclient/instantclient.html. Para
trabajar con el módulo OCI8, la versión
"básica" del Cliente Instantáneo de Oracle es
suficiente. El Cliente Instantáneo no necesita que
estén definidas las variables de entorno ORACLE_SID o
ORACLE_HOME. Sin embargo, puede que aun necesite definir
LD_LIBRARY_PATH y NLS_LANG.
Antes de usar esta extensión, asegúrese de haber
configurado apropiadamente sus variables de entorno Oracle para
que correspondan con el usuario de Oracle, así como su
usuario del demonio web. Estas variables deben ser configuradas
antes de iniciar su servidor web. Las
variables que necesita definir son las siguientes:
ORACLE_HOME
ORACLE_SID
LD_PRELOAD
LD_LIBRARY_PATH
NLS_LANG
Para más información sobre variables de entorno de
Oracle usadas con menos frecuencia como TNS_ADMIN, TWO_TASK,
ORA_TZFILE, y los varios parámetros de
globalización de Oracle como ORA_NLS33, ORA_NLS10 y las
variables NLS_* refiérase a la documentación de
Oracle.
Después de definir las variables de entorno para su usuario
de servidor web, asegúrese también de agregar al
usuario del servidor web (nobody, www) al grupo oracle.
Si su servidor web no arranca, o falla al arrancar:
Verifique que Apache esté enlazado con la biblioteca
pthread:
Si libpthread no se encuentra en la lista, necesita re-instalar
Apache:
Por favor note que en algunos sistemas, como UnixWare, se trata
de libthread en lugar de libpthread. PHP y Apache deben
configurarse con EXTRA_LIBS=-lthread.
El comportamiento de estas
funciones está afectado por los valores definidos en
php.ini.
Tabla 1. OCI8 Configuration Options | Name | Default | Changeable | Changelog |
|---|
| oci8.privileged_connect | "0" | PHP_INI_SYSTEM | Available since PHP 5.1.2. | | oci8.max_persistent | "-1" | PHP_INI_SYSTEM | Available since PHP 5.1.2. | | oci8.persistent_timeout | "-1" | PHP_INI_SYSTEM | Available since PHP 5.1.2. | | oci8.ping_interval | "60" | PHP_INI_SYSTEM | Available since PHP 5.1.2. | | oci8.statement_cache_size | "20" | PHP_INI_SYSTEM | Available since PHP 5.1.2. | | oci8.default_prefetch | "10" | PHP_INI_SYSTEM | Available since PHP 5.1.2. | | oci8.old_oci_close_semantics | "0" | PHP_INI_SYSTEM | Available since PHP 5.1.2. |
A continuación se
presenta una corta explicación de las directivas de
configuración.
- oci8.privileged_connect
boolean
This option enables privileged connections using external credentials
(OCI_SYSOPER, OCI_SYSDBA).
- oci8.max_persistent
int
The maximum number of persistent OCI8 connections per process.
Setting this option to -1 means that there is no limit.
- oci8.persistent_timeout
int
The maximum length of time (in seconds) that a given process is
allowed to maintain an idle persistent connection.
Setting this option to -1 means that idle persistent connections will
be maintained forever.
- oci8.ping_interval
int
The length of time (in seconds) that must pass before issuing a ping
during oci_pconnect(). When set to 0, persistent
connections will be pinged every time they are reused. To disable
pings completely, set this option to -1.
Nota:
Disabling pings will cause oci_pconnect() calls to operate at the
highest efficiency, but may cause PHP to not detect faulty connections,
such as those caused by network partitions, or if the Oracle server has
gone down since PHP connected, until later in the script. Consult the
oci_pconnect() documentation for more information.
- oci8.statement_cache_size
int
This option enables statement caching, and specifies how many
statements to cache. To disable statement caching just set this option to 0.
Nota:
A larger cache can result in improved performance, at the cost of
increased memory usage.
- oci8.default_prefetch
int
This option enables statement prefetching and sets the default number
of rows that will be fetched automatically after statement execution.
Nota:
A larger prefetch can result in improved performance, at the cost of
increased memory usage.
- oci8.old_oci_close_semantics
boolean
This option controls oci_close() behaviour.
Enabling it means that oci_close() will do
nothing; the connection will not be
closed until the end of the script. This is for backward
compatibility only. If you find that you need to enable this
setting, you are strongly encouraged to
remove the oci_close() calls from your
application instead of enabling this option.
Estas constantes están
definidas por esta extensión y estarán disponibles
solamente cuando la extensión ha sido o bien compilada dentro
de PHP o grabada dinámicamente en tiempo de ejecución.
Ejemplo 1. Consulta básica
<?php
$conexion = oci_connect('hr', 'hr', 'orcl'); if (!$conexion) { $e = oci_error(); print htmlentities($e['message']); exit; }
$consulta = 'SELECT * FROM DEPARTMENTS';
$id_sentencia = oci_parse($conexion, $consulta); if (!$id_sentencia) { $e = oci_error($conexion); print htmlentities($e['message']); exit; }
$r = oci_execute($id_sentencia, OCI_DEFAULT); if (!$r) { $e = oci_error($id_sentencia); echo htmlentities($e['message']); exit; }
print '<table border="1">'; while ($fila = oci_fetch_array($id_sentencia, OCI_RETURN_NULLS)) { print '<tr>'; foreach ($fila as $item) { print '<td>'.($item?htmlentities($item):' ').'</td>'; } print '</tr>'; } print '</table>';
oci_close($conexion); ?>
|
|
Ejemplo 2. Insertar con variables enlazadas
<?php
// Antes de ejecutar, cree la tabla: // CREATE TABLE MITABLA (mid NUMBER, myd VARCHAR2(20));
$conexion = oci_connect('scott', 'tiger', 'orcl');
$consulta = 'INSERT INTO MITABLA VALUES(:myid, :mydata)';
$id_sentencia = oci_parse($conexion, $consulta);
$id = 60; $datos = 'Algun dato';
oci_bind_by_name($id_sentencia, ':myid', $id); oci_bind_by_name($id_sentencia, ':mydata', $datos);
$r = oci_execute($id_sentencia);
if ($r) print "Una fila insertada";
oci_close($conexion);
?>
|
|
Ejemplo 3. Inserción de datos en una columna CLOB
<?php
// Antes de ejecutar, cree la table: // CREATE TABLE mitabla (miclave NUMBER, miclob CLOB);
$conexion = oci_connect('scott', 'tiger', 'orcl');
$mi_clave = 12343; // clave arbitraria para este ejemplo;
$sql = "INSERT INTO mitabla (miclave, miclob) VALUES (:miclave, EMPTY_CLOB()) RETURNING miclob INTO :miclob";
$id_sentencia = oci_parse($conexion, $sql); $clob = oci_new_descriptor($conexion, OCI_D_LOB); oci_bind_by_name($id_sentencia, ":miclave", $mi_clave, 5); oci_bind_by_name($id_sentencia, ":miclob", $clob, -1, OCI_B_CLOB); oci_execute($id_sentencia, OCI_DEFAULT); $clob->save("Una cadena muy larga");
oci_commit($conexion);
// Recuperacion de datos CLOB
$consulta = 'SELECT miclob FROM mitabla WHERE miclave = :miclave';
$id_sentencia = oci_parse ($conexion, $consulta); oci_bind_by_name($id_sentencia, ":miclave", $mi_clave, 5); oci_execute($id_sentencia, OCI_DEFAULT);
print '<table border="1">'; while ($fila = oci_fetch_array($id_sentencia, OCI_ASSOC)) { $resultado = $fila['MYCLOB']->load(); print '<tr><td>'.$resultado.'</td></tr>'; } print '</table>';
?>
|
|
Es posible acceder fácilmente a procedimientos almacenados
en la misma forma en que lo haría desde la línea de
comandos.
Ejemplo 4. Uso de Procedimientos Almacenados
<?php // por webmaster arroba remoterealty punto com $sth = oci_parse($dbh, "begin proc_nueva_dir( :id_direccion, '$nombre', '$apellido', '$companyia', '$dir1', '$dir2', '$ciudad', '$estado', '$cod_postal', '$pais', :cod_error );end;");
// Esto llama al procedimiento almacenado proc_nueva_dir, en donde // :id_direccion es una variable de entrada/salida y :cod_error es una // variable de salida. // Entonces crea la vinculacion:
oci_bind_by_name($sth, ":id_direccion", $id_direccion, 10); oci_bind_by_name($sth, ":cod_error", $cod_error, 10); oci_execute($sth);
?>
|
|
La extensión oci8 le ofrece 3 funciones diferentes para
conectarse con Oracle. Depende de usted usar la función
más apropiada para su aplicación, y la
información en esta sección tiene la
intención de ayudarle a realizar una selección
informada.
Conectarse a un servidor Oracle es una operación
razonablemente costosa, en términos del tiempo que toma en
ser completada. La función
oci_pconnect() usa un caché persistente
de conexiones que puede ser re-usado a través de
peticiones de diferentes scripts. Esto quiere decir que
usualmente sólo se incurrirá en el costo de
conexión una vez por proceso php (o hijo de apache).
Si su aplicación se conecta a Oracle usando un conjunto de
credenciales diferente para cada usuario web, el caché
persistente usado por oci_pconnect()
será menos útil a medida que el número de
usuarios concurrentes se incrementa, al punto en que puede
empezar a afectar adversamente el rendimiento general de su
servidor Oracle debido al mantenimiento de demasiadas conexiones
en reposo. Si su aplicación está estructurada de
este modo, es recomendable que configure su aplicación
usando los parmámetros oci8.max_persistent y
oci8.persistent_timeout
(estos le darán control sobre el tamaño y tiempo de
vida del caché de conexiones persistentes) o use
oci_connect() en su lugar.
Tanto oci_connect() como
oci_pconnect() emplean un caché de
conexiones; si realiza múltiples llamadas a
oci_connect() en un script dado, usando los
mismo parámetros, la segunda llamada y demás
después de ésta devolverán el gestor de
conexión existente. El caché usado por
oci_connect() es limpiado al final de la
ejecución del script, o cuando se cierra el gestor de
conexión
explícitamente. oci_pconnect() tiene un
comportamiento similar, aunque su caché es mantenido por
separado y sobrevive entre múltiples peticiones.
Es importante recordar esta característica del uso de
cachés, ya que da la apariencia de que dos gestores no
están aislados transaccionalmente (en realidad son el
mismo gestor de conexión, así que no hay
separación de ningún tipo). Si su aplicación
necesita dos conexiones separadas, aisladas transaccionalmente,
debería usar oci_new_connect().
oci_new_connect() siempre crea una nueva
conexión al servidor Oracle, independientemente de
cualquier otra conexión que pueda existir. Las
aplicaciones con alto tráfico web deberían tratar
de evitar el uso de oci_new_connect(),
especialmente en las secciones más ocupadas de la
aplicación.
Tabla 2. El controlador soporta los siguientes tipos cuando enlaza
parámetros con la función
oci_bind_by_name(): | Tipo | Asociación |
|---|
| SQLT_NTY | Asigna un tipo nativo de colección desde un
objeto colección PHP, tal como aquellos creados por
oci_new_collection(). | | SQLT_BFILEE | Asigna un descriptor nativo, tal como aquellos creados
por oci_new_descriptor(). | | SQLT_CFILEE | Asigna un descriptor nativo, tal como aquellos creados
por oci_new_descriptor(). | | SQLT_CLOB | Asigna un descriptor nativo, tal como aquellos creados
por oci_new_descriptor(). | | SQLT_BLOB | Asigna un descriptor nativo, tal como aquellos creados
por oci_new_descriptor(). | | SQLT_RDD | Asigna un descriptor nativo, tal como aquellos creados
por oci_new_descriptor(). | | SQLT_NUM | Convierte el parámetro PHP a un tipo largo 'C',
y lo enlaza a ese valor. | | SQLT_RSET | Asigna un gestor de sentencia nativo, tal como aquellos
creados por oci_parse() o aquellos
recuperados desde otras consultas OCI. | | SQLT_CHR y cualquier otro tipo | Convierte el parámetro PHP a un tipo cadena y lo
enlaza como una cadena. |
Tabla 3. Los siguientes tipos son soportados cuando se recuperan
columnas desde un conjunto de resultados: | Tipo | Asociación |
|---|
| SQLT_RSET | Crea un recurso de sentencia oci para representar el
cursor. | | SQLT_RDD | Crea un objeto ROWID. | | SQLT_BLOB | Crea un objeto LOB. | | SQLT_CLOB | Crea un objeto LOB. | | SQLT_BFILE | Crea un objeto LOB. | | SQLT_LNG | Enlazado como SQLT_CHR, devuelto como una
cadena | | SQLT_LBI | Enlazado como SQLT_BIN, devuelto como una
cadena | | Any other type | Enlazado como SQLT_BIN, devuelto como una
cadena |
|