informaticaPC

Tutorial de PHP

PHP y Oracle

PHP y Oracle

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 );
?>

Descargar ejemplo

Redondear números

Otra forma de conectar y realizar consultas Oracle

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).

Primera página Anterior Siguiente Última página
Usamos cookies para ofrecerte una experiencia mejorada, el continuar navegando supone que aceptas su uso