Está en la página 1de 42

BENEMRITA UNIVERSIDAD AUTNOMA DE

PUEBLA.

FACULTAD DE CIENCIAS DE LA COMPUTACIN.

Procedimientos Almacenados, Disparadores,


Vistas, Funciones, Transacciones, PDO.

Maestro: Carlos Armando Ros Acevedo.

CENEVAL
1
Objetivos:

El alumno integrar los conceptos de anlisis de la


informacin con la implementacin de objetos de bases de
datos relacionales.

El alumno entender la necesidad de analizar la


informacin como base para modelar procedimientos,
vistas, funciones, disparadores y transacciones en B.D.
Relacionales.

El alumno comprender la aplicacin de plataformas de


interconexin a diferentes motores de datos.

2
Programacin de Objetos de Bases de Datos
Relacionales (MYSQL).

ndice: Pginas

1. Vistas. 4
1.1 Definicin de Vistas. 4
1.2 Sintaxis para crear una vista. 5
1.3 Restricciones en vistas actualizables. 9
1.4 Eliminar una vista 10

2. Procedimientos Almacenados y Funciones 11


2.1 Definicin de Procedimiento Almacenado. 11
2.2 Condicionales 12
2.3 Bucles sencillos. 13
2.4 SELECT INTO. 14
2.5 Usando Cursores. 16
2.4 Ventajas de los cursores 19

3. Disparadores 20
3.1 Introduccin. 20
3.2 Registros OLD y NEW. 21

4. Transacciones 25
4.1Definicin
4.2 Propiedades de las transacciones 26

5. PDO 31
5.1 Definicin 31

3
1. Vistas

1.1 Definicin de Vista

Vistas son llamadas tablas virtuales debido a que el conjunto de resultados


de una vista no se guarda usualmente en la base de datos. El conjunto de
resultados para una vista es incorporado dinmicamente dentro de la sentencia
lgica y el conjunto de resultados se construye dinmicamente en tiempo de
ejecucin. Los datos introducidos a travs de una vista pueden venir de diferentes
tablas de bases de datos o de otras vistas desde la misma base u otras bases de
datos, incluso en otros servidores.

En otras palabras una vista es una tabla lgica compuesta de un conjunto


de resultados arrojados por una consulta query. Figura 1.0

4
Figura 1.0. Definicin de una Vista

1.2 Sintaxis para crear una vista

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]


VIEW nombre_vista [(columnas)]
AS sentencia_select
[WITH [CASCADED | LOCAL] CHECK OPTION]

Esta sentencia crea una vista nueva o reemplaza una existente si se


incluye la clusula OR REPLACE. La sentencia_select es una sentencia SELECT
que proporciona la definicin de la vista. Puede estar dirigida a tablas de la base o
a otras vistas.
Toda vista pertenece a una base de datos. Por defecto, las vistas se crean
en la base de datos actual. Pera crear una vista en una base de datos especfica,
indquela con base_de_datos.nombre_vista al momento de crearla.

5
Ahora si queremos reemplazar la vista creav1 por creav2 ejecutamos lo siguiente:

Las tablas y las vistas comparten el mismo espacio de nombres en la base


de datos, por eso, una base de datos no puede contener una tabla y una vista con
el mismo nombre.

6
Las columnas obtenidas en una vista deben tener un nombre nico aunque las
columnas se llamen igual de diferentes tablas. Para solucionar este problema en la
creacin de la vista se tiene que colocar un alias en cada campo que se llame
igual, diferenciando una columna de otra.

Al igual que las tablas, las vistas no pueden tener nombres de columnas
duplicados. Por defecto, los nombres de las columnas devueltos por la sentencia
SELECT se usan para las columnas de la vista. Para dar explcitamente un nombre
a las columnas de la vista utilice la clusula columnas para indicar una lista de
nombres separados con comas. La cantidad de nombres indicados en columnas
debe ser igual a la cantidad de columnas devueltas por la sentencia SELECT.

7
Las columnas devueltas por la sentencia SELECT pueden ser simples
referencias a columnas de la tabla, pero tambin pueden ser expresiones
conteniendo funciones, constantes, operadores, etc.

mysql> CREATE TABLE t (qty INT, price INT);


mysql> INSERT INTO t VALUES(3, 50);
mysql> CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
mysql> SELECT * FROM v;

+------+-------+-------+
| qty | price | value |
+------+-------+-------+
| 3 | 50 | 150 |
+------+-------+-------+

La definicin de una vista est sujeta a las siguientes limitaciones:

Cualquier tabla o vista referenciada por la definicin debe existir. Sin


embargo, es posible que despus de crear una vista, se elimine alguna tabla
o vista a la que se hace referencia. Para comprobar la definicin de una
vista en busca de problemas de este tipo, utilice la sentencia CHECK TABLE.

8
Utilizando check table;

La definicin no puede hacer referencia a una tabla TEMPORARY, y tampoco


se puede crear una vista TEMPORARY.

Las tablas mencionadas en la definicin de la vista deben existir siempre.

No se puede asociar un disparador con una vista.

En la definicin de una vista est permitido ORDER BY, pero es ignorado si se


seleccionan columnas de una vista que tiene su propio ORDER BY.

9
1.3 Restricciones en vistas actualizables

Algunas vistas son actualizables. Esto significa que se las puede emplear
en sentencias como UPDATE, DELETE, o INSERT para actualizar el contenido de la
tabla subyacente. Para que una vista sea actualizable, debe haber una relacin
uno-a-uno entre los registros de la vista y los registros de la tabla subyacente. Hay
otros elementos que impiden que una vista sea actualizable. Ms especficamente,
una vista no ser actualizable si contiene:

Funciones agregadas (SUM(), MIN(), MAX(), COUNT(), etctera)


DISTINCT
GROUP BY
HAVING
UNION o UNION ALL
Una subconsulta en la lista de columnas del SELECT
Hace referencia solamente a valores literales (en tal caso no hay una) tabla
subyacente para actualizar.
ALGORITHM = TEMPTABLE (utilizar una tabla temporal siempre resulta en una
vista no actualizable)

Con respecto a la posibilidad de agregar registros mediante sentencias INSERT, es


necesario que las columnas de la vista actualizable tambin cumplan los siguientes
requisitos adicionales:

No debe haber nombres duplicados entre las columnas de la vista.


La vista debe contemplar todas las columnas de la tabla en la base de datos
que no tengan indicado un valor por defecto.

La clusula WITH CHECK OPTION puede utilizarse en una vista actualizable


para evitar inserciones o actualizaciones excepto en los registros en que la clusula
WHERE de la sentencia_select se evale como true.

En la clusula WITH CHECK OPTION de una vista actualizable, las palabras


reservadas LOCAL y CASCADED determinan el alcance de la verificacin cuando la
vista est definida en trminos de otras vistas. LOCAL restringe el CHECK OPTION slo
a la vista que est siendo definida. CASCADED provoca que las vistas subyacentes
tambin sean verificadas. Si no se indica, el valor por defecto es CASCADED.
Considere las siguientes definiciones de tabla y vistas:

mysql> CREATE TABLE t1 (a INT);


mysql> CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 2
-> WITH CHECK OPTION;
mysql> CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 0
-> WITH LOCAL CHECK OPTION;

10
mysql> CREATE VIEW v3 AS SELECT * FROM v1 WHERE a > 0
-> WITH CASCADED CHECK OPTION;

Las vistas v2 y v3 estn definidas en trminos de otra vista, v1. v2 emplea check
option LOCAL, por lo que las inserciones slo atraviesan la verificacin de v2 . v3
emplea check option CASCADED de modo que las inserciones no solamente
atraviesan su propia verificacin sino tambin las de las vistas subyacentes. Las
siguientes sentencias demuestran las diferencias:

mysql> INSERT INTO v2 VALUES (2);


Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO v3 VALUES (2);
ERROR 1369 (HY000): CHECK OPTION failed 'test.v3'

1.4 DROP VIEW

DROP VIEW [IF EXISTS]


nombre_vista [, nombre_vista] ...
[RESTRICT | CASCADE]

DROP VIEW elimina una o ms vistas de la base de datos. Se debe poseer el privilegio DROP
en cada vista a eliminar.

La clusula IF EXISTS se emplea para evitar que ocurra un error por intentar eliminar una
vista inexistente.

11
2. Procedimientos Almacenados

2.1 Definicin de Procedimiento Almacenado.


Los procedimientos almacenados son porciones de cdigo que pueden ser
ejecutados exclusivamente en el servidor y que pueden tener parmetros de
entrada y de salida. Qu quiere decir esto? Bueno, pues que cuando creamos un
procedimiento almacenado ste ser ejecutado por MySQL y no por el programa
cliente que lo accede. Esto es muy til sobre todo en arquitecturas cliente/servidor
donde tenemos un servidor muy potente el cual podemos aprovechar para
ejecutar procesos, consultas y actualizaciones complejas en la base de datos.

12
2.2 Condicionales.
El condicional IF/ELSE es de gran ayuda para establecer criterios de
comparacin.

13
2.3 Bucles sencillos.
A continuacin vemos un ejemplo sencillo de un ciclo.

14
2.4 Select INTO.
A continuacin vemos un ejemplo sencillo de un ciclo.

15
16
2.5 Usando Cursores.
Los cursores nos ayudan a recorrer registros de una tabla o vista dentro de
un procedimiento almacenado.

Los cursores se utilizan para manejar las sentencias SELECT. Un cursor est
formado por un conjunto de registros devueltos por una instruccin SQL del tipo
SELECT. Desde un punto de visto interno a la base de datos, los cursores son
segmentos de memoria utilizados para realizar operaciones con los registros
devueltos tras ejecutar una sentencia SELECT.

Reciben el nombre de cursores implcitos, cuando la sentencia SELECT regresa solo


un registro. Para procesar instrucciones SELECT que devuelvan ms de una fila,
son necesarios cursores explictos combinados con una estructura de bloque.

Un cursor admite el uso de parmetros. Los parmetros deben declararse junto


con el cursor.

El siguiente diagrama representa como se procesa una instruccin SQL a travs de


un cursor.

Fases de un cursor

Cursores implcitos

Se utilizan cuando la sentencia SELECT devuelve un solo registro. En cada cursor


implcito debe existir palabra reservada INTO.

Las variables que reciben los datos devueltos por el cursor tienen que contienen el
mismo tipo de dato que las columnas de la tabla.

17
Ejemplo: Video Patito. Obtener el director de una determinada pelcula.

18
19
2.6 Ventajas de los Procedimientos Almacenados.

Algunas situaciones en que los procedimientos almacenados pueden ser particularmente


tiles:

Cuando mltiples aplicaciones cliente se escriben en distintos lenguajes o funcionan


en distintas plataformas, pero necesitan realizar la misma operacin en la base de
datos.

Cuando la seguridad es muy importante. Los bancos, por ejemplo, usan


procedimientos almacenados para todas las operaciones comunes. Esto proporciona
un entorno seguro y consistente, y los procedimientos pueden asegurar que cada
operacin se loguea apropiadamente. En tal entorno, las aplicaciones y los usuarios
no obtendran ningn acceso directo a las tablas de la base de datos, slo pueden
ejecutar algunos procedimientos almacenados.

Los procedimientos almacenados pueden mejorar el rendimiento ya que se necesita


enviar menos informacin entre el servidor y el cliente. El intercambio que hay es
que aumenta la carga del servidor de la base de datos ya que la mayora del trabajo
se realiza en la parte del servidor y no en el cliente. Considere esto si muchas
mquinas cliente (como servidores Web) se sirven a slo uno o pocos servidores de
bases de datos.

20
3. Disparadores

3.1 Introduccin

Un disparador (o trigger) es un tipo especial de procedimiento almacenado


asociado a una tabla que se ejecuta al realizar una operacin bsica (INSERT, un
DELETE o un UPDATE) sobre sta. La operacin bsica que despierta al trigger es
conocida como sentencia disparadora.

La ejecucin del disparador puede ser antes (before) o despus (after) de llevar a
cabo la sentencia disparadora. Es posible especificar condiciones adicionales para
la ejecucin del disparador (restrictores).

Dado que una sentencia disparadora puede afectar una o ms filas de una tabla,
es necesario especificar si se quiere que el disparador se ejecute para cada una de
las filas afectadas o para el bloque en general.

Para disear un disparador hay que cumplir dos requisitos:

Especificar las condiciones en las que se va a ejecutar el disparador. Esto se


descompone en un evento que causa la comprobacin del disparador y una
condicin que se debe cumplir para ejecutar el disparador.
Especificar las acciones que se van a realizar cuando se ejecute el
disparador.

Los triggers constituyen una potente herramienta para mantener la integridad de


la base de datos, ya que pueden llevar a cabo cualquier accin que sea necesaria
para el mantenimiento de dicha integridad.

Los triggers pueden llamar a otros procedimientos y disparar otros triggers, pero
no admiten parmetros y no pueden ser invocados desde otros procedimientos.

Los disparadores sea activan al crearlos.

Eliminar un disparador: DROP TRIGGER nombre_disparador;

21
Activar/ Desactivar disparadores: Existen dos opciones.

ALTER TRIGGER nombre_disparador {DISABLE | ENABLE};

ALTER TABLE nombre_tabla {ENABLE | DISABLE} ALL TRIGGERS;

Temporalidad del Evento: AFTER / BEFORE

BEFORE: Ejecutan la accin asociada antes de que la sentencia sea ejecutada

Decidir si la accin debe realizarse o no


Utilizar valores alternativos para la sentencia

CREATE TRIGGER NombreTrigger


BEFORE Insert ON NombreTabla .

AFTER: Ejecutan la accin asociada despus de que se haya ejecutado la sentencia

CREATE TRIGGER NombreTrigger


AFTER Insert ON NombreTabla

22
Registros old y new.

Estas variables se utilizan del mismo modo que cualquier otra variable, con la salvedad de
que no es necesario declararlas, son de tipo %ROWTYPE y contienen una copia del
registro antes (OLD) y despus (NEW) de la accin SQL (INSERT, UPDATE,
DELETE) que ha ejecutado el trigger. Utilizando esta variable podemos acceder a los datos
que se estn insertando, actualizando o borrando.

De uso exclusivo en los disparadores de nivel de fila, si se intenta hacer referencia a


cualquiera de los dos dentro de otro tipo de disparador, se obtendr un error de
compilacin.

La siguiente tabla resume los valores regresados por estos seudoregistros en diferentes
eventos.

Ejemplo: Suponga que se tienen las siguientes relaciones, asociadas a la concesin de


prstamos en un banco:

23
Ejemplo: Torneo Clausura 2012 Futbol Mexicano de Primera Divisin

24
25
4. Transacciones
4.1 Definicin

Se llama Transaccin a una coleccin de operaciones que forman una unidad


lgica de trabajo en una BD realizada por una o ms sentencias SQL
estrechamente relacionadas.

Una transaccin es una unidad de la ejecucin de un programa que lee y escribe


datos a y desde la Base de Datos. Puede consistir en varias operaciones de acceso
a la base de datos. Una Transaccin est delimitada por instrucciones de inicio
transaccin y fin transaccin (la transaccin consiste en todas las operaciones
que se ejecutan entre inicio transaccin y fin transaccin).

El concepto de transaccin se desarroll para atender los casos en los que el


estado resultante de la base de datos depende del xito completo en una serie de
operaciones. Este concepto vio la luz debido a que varias operaciones sucesivas
pueden modificar el resultado de operaciones anteriores. En esos casos, si alguna
operacin produce un error, el estado resultante puede ser indeterminado.

Para solucionar este problema, las transacciones agrupan una serie de operaciones
de manera que es posible garantizar la integridad del resultado final. O todas las
operaciones se ejecutan con xito y se confirman (se escriben en la base de
datos), o toda la transaccin se considera no realizada. La accin de cancelar una
transaccin se denomina deshacer la transaccin. Deshacer una transaccin
permite anular los cambios y recuperar el estado de la base de datos previo a la
transaccin.

Por ejemplo, en una transaccin bancaria automatizada, si un banco transfiere


dinero desde la cuenta A a la cuenta B, la retirada de fondos de A y el depsito en
B deben producirse con xito para procesar los fondos correctamente, de lo
contrario la transaccin entera debe cancelarse.

Esquematizando el proceso de transacciones tenemos: O se ejecutan todas las


operaciones que componen la transaccin, o no se realiza ninguna.

26
En SQL
xito Fracaso
Begin transacction Begin transacction
Instruccin 1 Instruccin 1
Instruccin 2 Instruccin 2
... ...
Commit work Rollback work
End transacction End transacction

4.2 PROPIEDADES

Una unidad lgica de trabajo debe exhibir cuatro propiedades, conocidas como
propiedades ACID (atomicidad, coherencia, aislamiento y durabilidad), para ser
calificacada como transaccin.

Atomicity : Una Transaccin (Tx) se ejecuta completamente de otra


manera se eliminan los cambios parciales realizados.

Begin Transaction - Programa - End Transaction

Responsable: El mtodo de recuperacin, de no completar todas las


operaciones, devuelve la BD a su estado anterior a empezar esa Tx
(rollback).

Coherencia: Asegura que los datos que observamos no cambian (por otros
usuarios) hasta que acabemos la Transaccin.

Despus de terminar una Transaccin la Base de datos no viola ninguna de


sus reglas: valores obligatorios, claves nicas, etc.

Responsable: los programadores mediante la definicin adecuada de la


integridad referencial: check, triggers, primary key, foreign key,

Aislamiento: Los efectos de una Tx no son visibles a otros usuarios mientras


no se confirmen.

Una Transaccin en ejecucin no puede revelar sus resultados a otras


transacciones concurrentes antes de finalizar.

Ms aun, si varias transacciones, se ejecutan concurrentemente, los


resultados deben ser los mismos que si ellas se hubieran ejecutado
secuencialmente. Esto se conoce como seriabilidad debido a que su
resultado es la capacidad de volver a cargar los datos iniciales y reproducir
27
una serie de transacciones para finalizar con los datos en el mismo estado
en que estaban despus de realizar transacciones originales.

Responsable: el mtodo de concurrencia: mecanismos, reglas, protocolos

Durabilidad: Si el sistema falla no debe permitir que se pierdan las


operaciones realizadas por Tx ya confirmadas.

Responsable: el mtodo o gestor de recuperacin.

28
Estados y operaciones de una transaccin

Control de transacciones en Oracle

Inicio de transaccin

Cuando no hay ya una transaccin en progreso, y se ejecuta una sentencia LDD o


LMD (interactivamente o dentro de una aplicacin)

Cada sentencia LDD es tratada como una transaccin N

No existe sentencia de tipo BEGIN TRANSACTION

Fin de transaccin

COMMIT: Finaliza la transaccin actual y hace permanentes (confirma) los cambios


realizados

ROLLBACK: Finaliza la transaccin actual y deshace los cambios realizados

Sentencia COMMIT
29
Una sentencia COMMIT marca el final de una transaccin correcta, implcita o
definida por el usuario. COMMIT hace que todas las modificaciones efectuadas
sobre los datos desde el inicio de la transaccin sean parte permanente de la base
de datos, y adems, libera los recursos mantenidos por la conexin. Su sintaxis es
la siguiente:

COMMIT COMMENT 'mensaje' | FORCE 'texto']

COMMENT sirve para comentar la transaccin en un mximo 255 caracteres.


FORCE fuera de modo manual una transaccin dudosa y es de uso exclusivo en
sistemas distribuidos de base de datos.

Sentencia SAVEPOINT

Esta sentencia permite crear un punto de restauracin dentro de una transaccin,


es decir, un punto al que podremos retroceder deshaciendo todo lo hecho
deshaciendo todo lo hecho desde l en adelante. Su sintaxis es la siguiente.

SAVEPOINT nombrePuntoRestauracin;

Sentencia ROLLBACK

Seala el final sin xito de una transaccin, elimina todas las modificaciones de
datos realizadas desde el inicio de la transaccin y tambin libera los recursos que
retiene la transaccin. Su sintaxis es la siguiente:

ROLLBACK [WORK] [TO SAVEPOINT nombrePuntoRestauracin | FORCE 'texto'];

30
Una transaccin que termina con xito se dice que est comprometida (commited),
una transaccin que haya sido comprometida llevar a la base de datos a un
nuevo estado consistente que debe permanecer incluso si hay un fallo en el
sistema. En cualquier momento una transaccin slo puede estar en uno de los
siguientes estados.

Activa (Active): el estado inicial; la transaccin permanece en este estado


durante su ejecucin.
Parcialmente comprometida (Uncommited): Despus de ejecutarse la
ltima transaccin.
Fallida (Failed): tras descubrir que no se puede continuar la ejecucin
normal.
Abortada (Rolled Back): despus de haber retrocedido la transaccin y
restablecido la base de datos a su estado anterior al comienzo de la
transaccin.
Comprometida (Commited): tras completarse con xito.

31
5. PDO
5.1 Definicin
La extensin Objetos de Datos de PHP (PDO por sus siglas en ingls) define una
interfaz ligera para poder acceder a bases de datos en PHP.

PDO proporciona una capa de abstraccin de acceso a datos, lo que significa que,
independientemente de la base de datos que se est utilizando, se usan las
mismas funciones para realizar consultas y obtener datos.

5.2 Qu bases de datos soporta PDO?

DBLIB: FreeTDS / Microsoft SQL Server / Sybase.


Firebird (http://firebird.sourceforge.net/): Firebird/Interbase 6.
IBM (IBM DB2).
INFORMIX - IBM Informix Dynamic Server.
MYSQL (http://www.mysql.com/): MySQL 3.x/4.0.
OCI (http://www.oracle.com): Oracle Call Interface.
ODBC: ODBC v3 (IBM DB2 and unixODBC).
PGSQL (http://www.postgresql.org/): PostgreSQL.
SQLITE (http://sqlite.org/): SQLite 3.x.

Conexin a una base de datos

Vamos a considerar el escenario de conexin MySQL conocido:

mysql_connect($host, $user, $password);

mysql_select_db($db);

A continuacin, se establece una conexin y luego seleccione la base de datos


predeterminada para la conexin. (Ignoramos la cuestin de los posibles errores.)

Para SQLite

$dbh = sqlite_open($db, 0666);

PostgreSQL

pg_connect("host=$host dbname=$db user=$user password=$password");

32
Como podemos ver, las tres bases de datos requieren de muy diferentes maneras
de abrir una conexin. Si bien esto no es un problema ahora, pero si siempre
utiliza el mismo sistema de gestin de base de datos en caso de que necesite
migrar, tendr que volver a escribir los scripts.

Con PDO, siempre tendremos que utilizar explcitamente el objeto de conexin, ya


que no hay otra manera de llamar a sus mtodos.

// For MySQL:
$conn = new PDO("mysql:host=$host;dbname=$db", $user, $pass);

// For SQLite:
$conn = new PDO("sqlite:$db");

// And for PostgreSQL:


$conn = new PDO("pgsql:host=$host dbname=$db", $user, $pass);

Con MySQL, SQLite o PostGreSQL la cadena de conexin sera:

// Let's keep our SQL in a single variable


$sql = 'SELECT DISTINCT make FROM cars ORDER BY make';
// Now, assuming MySQL:
mysql_connect('localhost', 'boss', 'password');
mysql_select_db('cars');
$q = mysql_query($sql);

// SQLite:
$m = sqlite_escape_string($make);
$q = sqlite_query("SELECT sum(price) FROM cars WHERE make='$m'",
$dbh);

// and PostgreSQL:
$m = pg_escape_string($make);
$q = pg_query("SELECT sum(price) FROM cars WHERE make='$m'");

Ahora con PDO sera:

$m = $conn->quote($make);
$q = $conn->query("SELECT sum(price) FROM cars WHERE make=$m");

33
PDO QUERY

La forma ms simple de consulta es el mtodo de consulta PDO. Como su nombre


indica, se utiliza para realizar consultas de bases de datos. Antes de comenzar a
consultar una base de datos. PDO proporciona un conjunto comn de
herramientas para bases de datos, una vez que tenemos la conexin correcta, el
resto del cdigo es el mismo, independientemente de la base de datos que elija.

PDO::FETCH_ASSOC: devuelve un array indexado por los nombres de las


columnas del conjunto de resultados.

PDO::FETCH_OBJ: devuelve un objeto annimo con nombres de propiedades


que se corresponden a los nombres de las columnas devueltas en el conjunto de
resultados.

PDO :: FETCH_CLASS crea una nueva instancia de la clase especificada. Los


nombres de los campos se asignan a las propiedades (variables) dentro de la clase
llamada. Esto ahorra un poco de cdigo y de la velocidad aumenta ya que las
asignaciones se tratan internamente.

SENTENCIAS PREPARADAS

Qu es una declaracin preparada? Una declaracin preparada es una declaracin


pre-compilado SQL que acepta cero o ms parmetros con nombre.

El SQL est preparado para su ejecucin. Esto es especialmente til cuando se


utiliza la misma instruccin de consulta o mltiples veces con diferentes
parmetros, o valores de campo. Tambin ayuda a evitar la inyeccin SQL.

PDO acepta dos tipos de marcadores de parmetros.


llamada -: nombre
signo de interrogacin -?

TRANSACCIONES

El proceso puede ser incluido en un solo acceso mediante el uso de una


transaccin. Las operaciones son muy simples y tienen el beneficio de un deshacer
los cambios si ocurre un error, quizs un fallo del sistema.

34
Ejemplo #1 Conectarse a MySQL

<?php
$gbd = new PDO('mysql:host=localhost;dbname=test', $usuario, $contrasea);
?>

Ejemplo #2 Manejo de errores de conexin

<?php
try {
$gbd = new PDO('mysql:host=localhost;dbname=test', $usuario, $contrasea)
;
foreach($gbd->query('SELECT * from FOO') as $fila) {
print_r($fila);
}
$gbd = null;
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
?>

Advertencia
Si la aplicacin no captura la excepcin lanzada por el constructor de PDO, la accin
predeterminada que toma el motor zend es la de finalizar el script y mostrar informacin
de rastreo. Esta informacin probablemente revelar todos los detalles de la conexin a la
base de datos, incluyendo el nombre de usuario y la contrasea. Es su responsabilidad
capturar esta excepcin, ya sea explcitamente (con una sentencia catch) o
implcitamente por medio deset_exception_handler().

Una vez realizada con xito una conexin a la base de datos, ser devuelta una instancia
de la clase PDO al script. La conexin permanecer activa durante el tiempo de vida del
objeto PDO. Para cerrar la conexin, es necesario destruir el objeto asegurndose de que
todas las referencias a l existentes sean eliminadas (esto se puede hacer
asignando NULL a la variable que contiene el objeto). Si no se realiza explcitamente, PHP
cerrar automticamente la conexin cuando el script finalice.

Ejemplo #3 Cerrar una conexin

<?php
$gbd = new PDO('mysql:host=localhost;dbname=test', $usuario, $contrasea);
// Use la conexin aqu

35
// ya se ha terminado; la cerramos
$gbd = null;
?>

Muchas aplicaciones web se beneficiarn del uso de conexiones persistentes a servidores


de bases de datos. Las conexiones persistentes no son cerradas al final del script, sino
que son almacenadas en cach y reutilizadas cuando otro script solicite una conexin que
use las mismas credenciales. La cach de conexiones persistentes permite evitar la carga
adicional de establecer una nueva conexin cada vez que un script necesite comunicarse
con la base de datos, dando como resultado una aplicacin web ms rpida.

Ejemplo #4 Conexiones persistentes

<?php
$gbd = new PDO('mysql:host=localhost;dbname=test', $usuario, $contrasea, arr
ay(
PDO::ATTR_PERSISTENT => true
));
?>

Transacciones y 'auto-commit'
Advertencia
PDO slo comprueba las capacidades de la transaccin al nivel del controlador. Si una
cierta condicin en tiempo de ejecucin implica que las transacciones no estn
disponibles, PDO::beginTransaction() seguir devolviendo TRUE sin ningn error si el
servidor de bases de datos acepta la solicitud de iniciar una transaccin.
Un ejemplo de esto podra ser el intentar usar transacciones en tablas MyISAM en una
base de datos MySQL.

Ejemplo #1 Ejecucin de un lote en una transaccin

En el siguiente ejemplo, se asume que se ha creado un conjunto de entradas para un


nuevo empleado, al cual se le ha asignado el nmero de ID 23. Adems de introducir los
datos bsicos de una persona, tambin es necesario registrar su sueldo. Es bastante
simple hacer dos actualizaciones independientes, pero encerrndolas en las
llamadasPDO::beginTransaction() y PDO::commit(), se garantiza que nadie ms ser

36
capaz de ver los cambios hasta que se hayan completado. Si algo sale mal, el bloque
catch revierte los cambios realizados desde que se cre la transaccin, y luego imprime
un mensaje de error.

<?php

$username='root';

$password='';

try {

$gbd = new PDO('mysql:host=localhost;dbname=seminario',


$username,$password,

array(PDO::ATTR_PERSISTENT => true));

echo "Conectado\n";

} catch (Exception $e) {

die("No se pudo conectar: " . $e->getMessage());

try {

$gbd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$gbd->beginTransaction();

$gbd->exec("insert into usuarios(login,password,nivel) values ('usuario',


'password', 1)");

$gbd->commit();

} catch (Exception $e) {

$gbd->rollBack();

echo "Fallo: " . $e->getMessage();

37
}

?>

Sentencias preparadas y procedimientos


almacenados
Muchas de las bases de datos ms maduras admiten el concepto de sentencias
preparadas. Estas pueden definirse como un tipo de plantillas compiladas para SQL que
las aplicaciones quieren ejecutar, que pueden ser personalizadas usando parmetros de
variables. Las sentencias preparadas ofrecen dos grandes beneficios:

o La consulta slo necesita ser analizada (o preparada) una vez, pero puede ser
ejecutada mltiples veces con los mismos o diferentes parmetros. Cuando la
consulta es preparada, la base de datos analizar, compilar y optimizar su plan
para ejecutarla. Para consultas complejas, este proceso puede tomar suficiente
tiempo como para que ralentice notablemente una aplicacin si fuera necesario
repetir la misma consulta muchas veces con los mismos parmetros. Usando una
sentencia preparada, la aplicacin evita repetir el ciclo de
anlisis/compilacin/optimizacin. Esto significa que las sentencias preparadas
usan menos recursos y se ejecutan ms rpidamente.
o Los parmetros para las sentencias preparadas no necesitan estar
entrecomillados; el controlador automticamente se encarga de esto. Si una
aplicacin usa exclusivamente sentencias preparadas, el desarrollador puede
estar seguro de que no ocurrirn inyecciones SQL (sin embargo, si otras partes de
la consulta se construyen con datos de entrada sin escapar, las inyecciones SQL
pueden ocurrir).

Las sentencias preparadas son tan tiles que son la nica caracterstica que PDO
emular para los controladores que no las admitan. Esto asegura que una aplicacin sea
capaz de usar el mismo paradigma de acceso a datos independientemente de las
capacidades de la base de datos.

38
Ejemplo #1 Inserciones reiteradas usando sentencias preparadas

Este ejemplo realiza dos consultas de tipo INSERT sustituyendo name y value por los
valores correspondientes.

<?php
$sentencia = $gbd-
>prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$sentencia->bindParam(':name', $nombre);
$sentencia->bindParam(':value', $valor);

// insertar una fila


$nombre = 'uno';
$valor = 1;
$sentencia->execute();

// insertar otra fila con diferentes valores


$nombre = 'dos';
$valor = 2;
$sentencia->execute();
?>

Ejemplo #2 Inserciones reiteradas usando sentencias preparadas

Este ejemplo realiza dos consultas de tipo INSERT sustituyendo name y value por el
parmetro de sustitucin ? posicional.

<?php
$sentencia = $gbd-
>prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$sentencia->bindParam(1, $nombre);
$sentencia->bindParam(2, $valor);

// insertar una fila


$nombre = 'uno';
$valor = 1;
$sentencia->execute();

// insertar otra fila con diferentes valores


$nombre = 'dos';
$valor = 2;

39
$sentencia->execute();
?>

Ejemplo #3 Obtener datos usando sentencias preparadas

Este ejemplo obtiene datos basndose en un valor de clave proporcionado por un


formulario. Los datos de usuario son automticamente entrecomillados, con lo cual no hay
riesgo de un ataque por inyeccin SQL.

<?php
$sentencia = $gbd->prepare("SELECT * FROM REGISTRY where name = ?");
if ($sentencia->execute(array($_GET['name']))) {
while ($fila = $sentencia->fetch()) {
print_r($fila);
}
}
?>

Si el controlador de la base de datos lo admite, una aplicacin podra tambin vincular


parmetros para salida y para entrada. Los parmetros de salida son tpicamente usados
para recuperar valores de procedimientos almacenados. Los parmetros de salida son
ligeramente ms complejos de usar que los de entrada, de manera que el desarrollador
debe saber lo grande que podra ser un parmetro dado cuando se vincula. Si el valor
resulta ser ms grande que el tamao que indica, se emitir un error.

Ejemplo #4 Llamar a un procedimiento almacenado con un parmetro de salida

<?php
$sentencia = $gbd->prepare("CALL sp_returns_string(?)");
$sentencia->bindParam(1, $valor_devuleto, PDO::PARAM_STR, 4000);

// llamar al procedimiento almacenado


$sentencia->execute();

print "El procedimiento devolvi $valor_devuleto\n";


?>

Los desarrolladores podran tambin especificar parmetros que contienen valores tanto
de entrada como de salida; la sintaxis es similar a la de los parmetros de salida. En el
siguiente ejemplo, la cadena 'hola' es pasada al procedimiento almacenado, y cuando
ste finaliza, 'hola' es reemplazada con el valor de retorno del procedimiento.

40
Ejemplo #5 Llamar a un procedimiento almacenado con un parmetro de
entrada/salida

<?php
$sentencia = $gbd->prepare("CALL sp_takes_string_returns_string(?)");
$valor = 'hola';
$sentencia-
>bindParam(1, $valor, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000);

// llamar al procedimiento almacenado


$sentencia->execute();

print "procedure returned $valor\n";


?>

Ejemplo #6 Uso invlido de un parmetro de sustitucin

<?php
$sentencia = $gbd->prepare("SELECT * FROM REGISTRY where name LIKE '%?%'");
$sentencia->execute(array($_GET['name']));

// los parmetros de sustitucin deben usarse en el lugar del valor completo


$sentencia = $gbd->prepare("SELECT * FROM REGISTRY where name LIKE ?");
$sentencia->execute(array("%$_GET[name]%"));
?>

41
BIBLIOGRAFIA

www.prograweb.com.mx/tallerBD/

Post, Gerald V. (2006). Sistemas de administracin para bases de datos. 1era. edicin.
Mxico

Raghu Ramakrishnan, Johanes Gehrke. (2007) Sistemas de gestin de bases de datos. 3er.
edicin. Mc. Graw-Hill

Silberschatz, Korth & Sudarshan. (2006). Fundamentos de Base de Datos. Mc Graw Hil.
Quinta Edicin. Espaa.

http://www.php.net/manual/es/pdo.constants.php

42

También podría gustarte