Hace algun tiempo tuve la necesidad de trabajar con Oracle 9i y PHP en una intranet.
Uno de los problemas que tuve es de interactuar PHP con los procedimientos almacenados de oracle. o las funciones almacenadas, despues de varios dias de busqueda y un poco de conocimiento logre hacerlo y posteare aqui como hacerlo por si alguien lo necesita alguna vez.
Para este ejemplo vamos a necesitar ORACLE EXPREES EDITION (version gratuita), WAMP o cualquier servidor que soporte PHP previamente configurado para trabajar con ORACLE y cualquier editor de texto.
Este ejemplo consta de vamos a crear en nuestra base de datos ORACLE XE una tabla que se llame USUARIOS con parametros realmente sencillos para hacerlo practico.
una vez creada la base de datos crearemos dos bloques de codigo SQL en la interfaz de ORACLE XE.Código:CREATE TABLE "USUARIOS" ( "CODIGO" NUMBER NOT NULL ENABLE, "NOMBRES" VARCHAR2(200) NOT NULL ENABLE, "APELLIDOS" VARCHAR2(200) NOT NULL ENABLE, CONSTRAINT "USUARIOS_PK" PRIMARY KEY ("CODIGO") ENABLE ) / CREATE OR REPLACE TRIGGER "BI_USUARIOS" before insert on "USUARIOS" for each row begin select "USUARIOS_SEQ".nextval into :NEW.CODIGO from dual; end; / ALTER TRIGGER "BI_USUARIOS" ENABLE
La primera sera un procedimiento almacenado vamos a crear una funcion que nos muestre si el usuario existe o no en la base de datos pasandole por parametros el nombre y apellido del usuario:
Ahora vamos a crear nuestra funcion almacenada casi identica al stored procedures.Código:CREATE OR REPLACE PROCEDURE sayHello (nombre IN VARCHAR2, apellidoUsuario OUT VARCHAR2) AS result VARCHAR(200); BEGIN SELECT APELLIDOS INTO result FROM USUARIOS WHERE NOMBRES = nombre; apellidoUsuario := result; EXCEPTION WHEN NO_DATA_FOUND THEN apellidoUsuario := 'No Existe'; END;
Como podran ver son muy sencillos, cabe recalcar que esta no es una clase de bases de datos y los ejemplos son bien practicos solo para demostrar como invocar estas funciones y procedimientos desdde PHP.Código:create or replace function obtener_id( nombres IN varchar2) return number is begin return 2; end;
Una vez que tenemos lista la data ahora si podemos jugar con ella a traves de PHP. para este ejempplo crearemos dos scripts. uno que sera funciionOra.php y procedureOra.php
Empezemos procedureOra.php
podemos ejecutar el php y si todo lo hemos hecho bien nos saldra como resultado el paellido de nuestro usuario y en caso no estar en la base saldra que no existe.Código PHP:/** La respectiva llamada a la base de datos
* Este es un ejemplo bien sencillo la conexion se debera hacer con una clase de manera de centralizar las multiples
* conexiones de nuestra aplicacion
*/
//Aqui realizamos como cualquier string hacia la base de datos en este caso Cada procedimiento almacenado Empezara con la palabra BEGIN y TERMINARA en END, para mas informacion recomiendo leer algun manual de PL/SQL.
$query = "BEGIN sayHello(:nombre , :apellidoUsuario ); END;";
$stmt = OCIParse($conn, $query);
OCIBindByName($stmt, ':nombre',$nombres,32);
OCIBindByName($stmt, ':apellidoUsuario',$apellidoUsuario,32);
$nombres='Victor Manuel';
OCIExecute($stmt);
echo $apellidoUsuario."\n";
Si quieres saber un poco mas sobre el funcionamiento de OCIBindByName puedes entrar [Solo usuarios registrados pueden ver los links. ]
y por ultimo nuestro archivo functionOra.php
Listo el ejemplo es muy basico para entender de una manera simple como interactuar con ORacle desde php.Código PHP:$sql = "select obtener_id(:codigo)RESULT FROM DUAL";
$stmt = OCIParse($conn, $sql);
OCIBindByName($stmt, ':codigo',$codigo,32);
$codigo=1;
OCIExecute($stmt);
OCIFetch($stmt);
$tot=OCIResult($stmt,"RESULT");
echo "resultado es: ".$tot;
espero les sirva..
Saludos Estimados amigos de Forogenio!