A continuación vamos a mostrarte un sencillo ejemplo de cómo trabajar con bases de datos Oracle, para ello en la base de datos test de Oracle crea la siguiente tabla que utilizaremos en el ejemplo:
create table tbl_personas (
id integer not null check (id > 0),
nombre varchar(50) not null,
primary key (id)
)
NOTA: a día de hoy, la última versión de Oracle disponible (Oracle 10g) no soporta unsigned, en su lugar podemos usar la cláusula check.
A continuación creamos una función para realizar la conexión utilizando la funciones de PHP oci_connect() para conectar con Oracle y seleccionar la base de datos, y oci_error() que nos devolverá un mensaje de error si se produjo alguno (lo detectamos usando or die, que detendrá la ejecución):
<?php
function conectar_Oracle( $usuario, $pass, $cadenaConexion )
{
// Conectar con Oracle:
$conexion = oci_connect($usuario, $pass, $cadenaConexion) or die ( "Error al conectar : ".oci_error() );
return $conexion;
}
?>
Creamos otra función que utilizaremos tanto para borrar todos los registros de la tabla o bien sólo uno especificado. Para procesar una consulta (tanto de selección como de actualización) usaremos las funciones oci_parse() (para preparar la consulta) y oci_execute() (para procesar la consulta). También es recomendable usar oci_free_statement() para liberar los recursos de una sentencia o cursor:
<?php
function borrarPersona( $conexion, $id )
{
$sql = "DELETE FROM tbl_personas";
// Si 'id' es diferente de 'null' sólo se borra la persona con el 'id' especificado:
if( $id != null )
$sql .= " WHERE id=".$id;
$stmt = oci_parse($conexion, $sql); // Preparar la sentencia
$ok = oci_execute( $stmt ); // Ejecutar la sentencia
oci_free_statement($stmt); // Liberar los recursos asociados a una sentencia o cursor
return $ok;
}
?>
Después creamos otra función para insertar un registro:
<?php
function insertarPersona( $conexion, $id, $nombre )
{
$sql = "INSERT INTO tbl_personas VALUES (".$id.", '".$nombre."')";
$stmt = oci_parse($conexion, $sql); // Preparar la sentencia
$ok = oci_execute( $stmt ); // Ejecutar la sentencia
oci_free_statement($stmt); // Liberar los recursos asociados a una sentencia o cursor
return $ok;
}
?>
Creamos una nueva función para modificar un registro:
<?php
function modificarPersona( $conexion, $id, $nombre )
{
$sql = "UPDATE tbl_personas SET nombre='".$nombre."' WHERE id=".$id;
$stmt = oci_parse($conexion, $sql); // Preparar la sentencia
$ok = oci_execute( $stmt ); // Ejecutar la sentencia
oci_free_statement($stmt); // Liberar los recursos asociados a una sentencia o cursor
return $ok;
}
?>
La siguiente función nos permite listar la tabla completa. Utilizamos las funciones de PHP oci_fetch_object() (devuelve los valores de los campos en un Objeto de PHP, debiéndose escribir los nombres de los campos en mayúsculas) y oci_num_rows() (devuelve el número de registros encontrados, aunque sólo después de haber usado alguna de las funciones oci_fetch_*.):
<?php
function listarPersonas( $conexion )
{
$sql = "SELECT * FROM tbl_personas ORDER BY id";
$filas = 0;
$stmt = oci_parse($conexion, $sql); // Preparar la sentencia
$ok = oci_execute( $stmt ); // Ejecutar la sentencia
if( $ok == true )
{
/* Mostrar los datos. Lo hacemos de este modo puesto que no es posible obtener el número de
registros sin antes haber accedido a los datos mediante las funciones 'oci_fetch_*'):
*/
if( $obj = oci_fetch_object($stmt) )
{
echo "<p/>LISTADO DE PERSONAS<br/>";
echo "===================<p />";
// Recorrer el resource y mostrar los datos (HAY QUE PONER LOS NOMBRES DE LOS CAMPOS EN MAYÚSCULAS):
do
{
echo $obj->ID." - ".$obj->NOMBRE."<br />";
} while( $obj = oci_fetch_object($stmt) );
// Mostrar el número de registros:
echo "<p>(".oci_num_rows($stmt).") fila(s) encontrado(s)</p>";
}
else
echo "<p>No se encontraron personas</p>";
}
else
$ok = false;
oci_free_statement($stmt); // Liberar los recursos asociados a una sentencia o cursor
return $ok;
}
?>
Por último, creamos otra función que procesará una consulta y nos devolverá un Objeto en PHP con los datos del registro encontrado:
<?php
function buscarPersona( $conexion, $id )
{
$sql = "SELECT * FROM tbl_personas WHERE id=".$id."";
$objPersona = null;
$stmt = oci_parse($conexion, $sql); // Preparar la sentencia
$ok = oci_execute( $stmt ); // Ejecutar la sentencia
if( $ok == true )
{
// Si se encontró el registro, se obtiene un objeto en PHP con los datos de los campos:
if( oci_num_rows($stmt) > 0 )
$objPersona = oci_fetch_object( $stmt );
}
oci_free_statement($stmt); // Liberar los recursos asociados a una sentencia o cursor
return $objPersona;
}
?>
El código fuente principal del programa. Observa que debemos introducir los datos de acceso (usuario y contraseña) para poder conectar con Oracle:
<?php
// Conectar (se detendrá la ejecución si se produce un error):
$conexion = conectar_Oracle( "TU_USUARIO_ORACLE",
"TU_PASSWORD",
"(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=IP_DEL_SERVIDOR)(PORT=1521)))(CONNECT_DATA=(SID=NOMBRE_DE_LA_BASE_DE_DATOS)))"
);
// Borrar todos los datos de la tabla:
$ok = borrarPersona( $conexion, null );
if( $ok == false )
echo "Error al borrar los datos.<br/>";
else
echo "Datos borrados correctamente.<br/>";
// insertar una persona:
$ok = insertarPersona( $conexion, 1, 'Juan Rodríguez P.' );
if( $ok == false )
echo "Error al insertar los datos.<br/>";
else
echo "Datos insertados correctamente.<br/>";
// insertar una persona:
$ok = insertarPersona( $conexion, 2, 'Juan Rodríguez P.' );
// insertar una persona:
$ok = insertarPersona( $conexion, 3, 'Roberta Amador H.' );
// Modificar la persona número 2:
$ok = modificarPersona( $conexion, 1, "Alfredo Ramírez E." );
if( $ok == false )
echo "Error al modificar los datos.<br/>";
else
echo "Datos modificados correctamente.<br/>";
// Modificar la persona:
$ok = listarPersonas( $conexion );
if( $ok == false )
echo "<p>Error al listar los datos.</p>";
else
echo "<p>Datos listados correctamente.</p>";
$objPersona = buscarPersona( $conexion, 2 );
if( $objPersona == null )
echo "No se encontró la persona";
else
echo "El nombre de la persona con el código: [".$objPersona->id."] es [".$objPersona->nombre."]";
// Cerrar la conexión a Oracle
oci_close( $conexion );
?>

Vea también: [ Funciones de Oracle ] - [ Configurar PHP para acceder a Bases de Datos ] - [ oci_connect() ] - [ oci_close() ]

Vea también: [ oci_parse() ] - [ oci_execute() ] - [ oci_num_rows() ] - [ oci_fetch_object() ] - [ oci_free_statement() ]
Dado que oci_connect() sólo devuelve false en caso de error, puede resultar interesante la siguiente modificación que arrojará una excepción en caso de que ocurra uno:
<?php
function conectar_Oracle( $usuario, $pass, $cadenaConexion )
{
$conexion = null;
try
{
$conexion = oci_connect($usuario,
$pass,
$cadenaConexion
) or die ( "Error al conectar: ".oci_error() );
if( $conexion == false )
throw new Exception( "Error Oracle ".oci_error() );
}
catch( Exception $e )
{
throw $e;
}
return $conexion;
}
?>
La siguiente función también nos resultará útil puesto que oci_parse() y oci_execute() tampoco devuelven una excepción sino sólo false:
<?php
function my_oci_query( $conexion, $sql )
{
$stmt = @oci_parse( $conexion, $sql );
if( $stmt == false )
throw new Exception( "Error Oracle ".oci_error() );
else
{
$ok = @oci_execute( $stmt );
if( $ok == false )
{
$stmt = null;
throw new Exception( "Error Oracle ".oci_error() );
}
}
return $stmt;
}
?>
NOTA: La arroba '@' se utiliza antes del nombre de una función para que no se muestren por pantalla mensajes de aviso o error (en caso de que se produzcan).

Vea también: [ Excepciones en PHP ] - [ Control de Excepciones en PHP ] - [ Exception ]