Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PUEBLA.
CENEVAL
1
Objetivos:
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
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
4
Figura 1.0. Definicin de una Vista
5
Ahora si queremos reemplazar la vista creav1 por creav2 ejecutamos lo siguiente:
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.
+------+-------+-------+
| qty | price | value |
+------+-------+-------+
| 3 | 50 | 150 |
+------+-------+-------+
8
Utilizando check table;
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:
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:
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
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.
Fases de un cursor
Cursores implcitos
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.
20
3. Disparadores
3.1 Introduccin
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.
Los triggers pueden llamar a otros procedimientos y disparar otros triggers, pero
no admiten parmetros y no pueden ser invocados desde otros procedimientos.
21
Activar/ Desactivar disparadores: Existen dos opciones.
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.
La siguiente tabla resume los valores regresados por estos seudoregistros en diferentes
eventos.
23
Ejemplo: Torneo Clausura 2012 Futbol Mexicano de Primera Divisin
24
25
4. Transacciones
4.1 Definicin
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.
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.
Coherencia: Asegura que los datos que observamos no cambian (por otros
usuarios) hasta que acabemos la Transaccin.
28
Estados y operaciones de una transaccin
Inicio de transaccin
Fin de transaccin
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:
Sentencia SAVEPOINT
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:
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.
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.
mysql_select_db($db);
Para SQLite
PostgreSQL
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.
// For MySQL:
$conn = new PDO("mysql:host=$host;dbname=$db", $user, $pass);
// For SQLite:
$conn = new PDO("sqlite:$db");
// 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'");
$m = $conn->quote($make);
$q = $conn->query("SELECT sum(price) FROM cars WHERE make=$m");
33
PDO QUERY
SENTENCIAS PREPARADAS
TRANSACCIONES
34
Ejemplo #1 Conectarse a MySQL
<?php
$gbd = new PDO('mysql:host=localhost;dbname=test', $usuario, $contrasea);
?>
<?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.
<?php
$gbd = new PDO('mysql:host=localhost;dbname=test', $usuario, $contrasea);
// Use la conexin aqu
35
// ya se ha terminado; la cerramos
$gbd = null;
?>
<?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.
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 {
echo "Conectado\n";
try {
$gbd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$gbd->beginTransaction();
$gbd->commit();
$gbd->rollBack();
37
}
?>
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);
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);
39
$sentencia->execute();
?>
<?php
$sentencia = $gbd->prepare("SELECT * FROM REGISTRY where name = ?");
if ($sentencia->execute(array($_GET['name']))) {
while ($fila = $sentencia->fetch()) {
print_r($fila);
}
}
?>
<?php
$sentencia = $gbd->prepare("CALL sp_returns_string(?)");
$sentencia->bindParam(1, $valor_devuleto, PDO::PARAM_STR, 4000);
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);
<?php
$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