Universidad Tecnológica de Tehuacán

Ing. en Tecnologías de la Información y
            Comunicación

   Base de Datos para Aplicaciones
 «Transacciones y Stored Procedures»
    Ing. Octavio Sánchez Delgado

     TSU Vera Sosa Guillermina
       8° A enero-abril 2013

                             24 de enero de 2013
Transacciones


Son operaciones que se realizan en un bloque, para ello
se utiliza:
«Begin» o «start» para iniciar una transacción.
«Rollback» para cancelar y regresar al estado final.
«Commit» para confirmar la transacción y finalizar la
transacción.
Por lo tanto una transacción se define para cumplir las
restricciones de integridad de la base de datos.
Propiedades


Atomicidad: Confirmación automática de todas las
transacciones.
Consistencia: Que se vean reflejados los cambios
realizados.
Aislamiento: de manera independiente no comparten
información entre ellas, por lo tanto realizan primero sus
operaciones y luego las suyas.
Durabilidad: Asegurar que la información es correcta. Una
vez confirmado los cambios ya no se desaceran los
cambios, por lo tanto se mantendrá la información.
Ventajas de usar transacciones


   Permite recuperar de errores como:
   Servidores pasmados
   Falta de energía
   Errores ajenos a la base de datos
   Errores de la base de datos
   Consultas mal ejecutadas
Para lo cual puedes ejecutar operaciones y ver los resultados
y si estas de acuerdo entonces finalizas con un commit.
Ejemplo de una transacción


Begin
Insert into tb2 values(2,’Silla’);
Select *from tb2;
Commit;
End;
En este ejemplo se inicia la transacción, luego se inserta
un registro en la tabla tb2, después se realiza una
consulta y finalmente se cierra la finalización.
Procedimientos almacenados


Es un conjunto de operaciones o comandos que
pueden almacenarse en el servidor.
Una vez almacenados puedes acceder y utilizar para
realizar una o varias operaciones especificas con el
mismo Stored Procedures.
Dentro de un procedimiento podemos hacer uso de
una o varias transacciones especificas.
Para llamar un Stored Procedures se utiliza el call y el
nombre del Stored Procedures.
Estructura


  Para utilizar un stored procedure cambiamos el
  delimitador para que no nos mande error en las
  sentencias del procedimiento.
Delimiter // #Cambiar el delimitador para que no genere errores
Create Procedure nombre_SP(Parametros)
Begin #iniciar el SP
[Conjunto de operaciones o sentencias]
End; #Cerrar el SP
Ejemplo


Ejecutando un stored en MySQL se realizaría así.
mysql> delimiter //
mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
-> BEGIN
-> SELECT COUNT(*) INTO param1 FROM t;
-> END
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
Manejador de errores «Handler»


Es invocado cuando se da un evento o condición
definida con anterioridad. Este evento está siempre
asociado con una condición de error, pero puedes tener
tres formas de definir el error:
  Como código de error de MySQL
  Como código SQLSTATE ANSI-standard
  Como       nombre        de    condición,   ejemplo:
  SQLEXCEPTION,SQLWARNING y NOT FOUND.
SQLWARNING es una abreviación para todos los códigos SQLSTATE que comienzan con
01.
NOT FOUND es una abreviación para todos los códigos SQLSTATE que comienzan con 02.
SQLEXCEPTION es una abreviación para todos los códigos SQLSTATE no tratados por
SQLWARNING o NOT FOUND.
En el comando Handler podemos manejar una o varias condiciones . Si una o varias
condiciones se cumplen entonces se ejecuta el comando que se especifique.
Handler CONTINUE : continúa la rutina actual tras la ejecución del comando del handler.
Handler EXIT , termina la ejecución del comando compuesto BEGIN...END actual.
Handler UNDO: todavía no se soporta.
Para tratar errores específicos


Podemos utilizar la siguente estructura para un error en
especifico:
DECLARE condition_name CONDITION FOR
condition_value
condition_value:
SQLSTATE [VALUE] sqlstate_value
| mysql_error_code
Para tratar varios errores

DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
handler_type:
CONTINUE
| EXIT
| UNDO
condition_value:
SQLSTATE [VALUE] sqlstate_value
| condition_name
| SQLWARNING
| NOT FOUND
| SQLEXCEPTION
| mysql_error_code
mysql> create procedure pstar ()
begin declare v int;
declare exit handler for sqlexception select
'SQLEXCEPTION';
drop table if exists tstar;
create table tstar (s1 int, s2 char(1));
set v = 0; while TRUE do insert into tstar values (null,null);
end while;
end//
En este ejemplo si cacha un error de una tabla, borra la
tabla después la crea, compara el valor de la variable y
mientras exista crea un registro en la tabla.
Scripts para manejar errores


Los dos siguientes script son un ejemplo de cómo
hacer el manejo de los errores, con procedimientos
almacenados, transacciones y el uso del If dentro de
los procedimientos almacenados.
Para esto se utilizó la tabla de productos de la base de
datos ventas.
Handler Exit
 # Procedimiento para controlar el error de cuando se inserta una llave foránea
                                que no existe.
CREATE PROCEDURE ins2(nom varchar(100), prec double, num int(11), cat int,
prove int) #Creación del procedimiento con la declaración de variables
BEGIN #inicio del SP
         BEGIN #Inicio de la transacción
                    DECLARE x INT DEFAULT 0; #declaración de x
                    DECLARE EXIT HANDLER FOR SQLSTATE '23000' SET x=2; #declaración
  del manejador de error y si lo cacha tomara el valor 2.
                  insert into producto (Nombre, Precio, Stock, idCategoria,
   idProveedor) values(nom, prec, num, cat, prove); #Inserción del producto
                  IF x = 2 THEN #inicio del IF
                             ROLLBACK; #Se deshacen los registros realizados
                             SELECT CONCAT('ERROR al insertar una llave foránea que
   no existe'); #Mensaje sobre el Error
                  else
                             COMMIT; #Se confirma la inserción sino hay error
                  END IF; #inicio del IF
         END; #Inicio de la transacción
END; #fin del SP
Ejecución del procedimiento con
             Handler

# Llamada el SP correcto el registro
call ins2('leche', '23','3','4','2');
En esta llamada el registro se realizara correctamente y no se
utilizara el manejador de error del SP.

# Llamada el SP incorrecto el registro
call ins2('leche', '23','3','d','7');
En esta llamada en la penúltima columna es una llave
foránea, y el tipo de dato tampoco corresponde, por lo cual
se ejecutara el manejador de error y no hará el registro.
Handler Continue
 Error: 1054. Los tipos de datos de los campos no son los
 definidos, se colocara un cero en el campo del registro.

CREATE PROCEDURE ins3(nom varchar(100), prec double, num int(11), cat int, prove int)
#Creación del procedimiento con la declaración de variables
BEGIN #inicio del SP
          BEGIN #inicio de la transacción
              DECLARE x INT DEFAULT 0;#declaración de la variable
              DECLARE CONTINUE HANDLER FOR 1054 SET x = 1; #Declaración del handler
              insert into producto (Nombre,Precio,Stock,idCategoria,idProveedor) values
(nom, prec, num, cat, prove); #Inserción del registro
              SELECT CONCAT('los tipos de datos de los campos no son los definidos y se
colocara un cero en el campo') as "Resultado"; #Impresión del mensaje de error
               IF x = 1 then
                         SELECT CONCAT('WARNING: error') as 'Resultado';
                         COMMIT; #Confirma ejecución
               END IF; #fin del IF
          END; #Fin de la transacción
END; #Fin del SP
Ejecución del procedimiento con
             Handler

En este manejo de error se esta insertando un registro
correcto por lo tanto no se utilizara el manejador de error .
# Llamada al SP correcto el registro
call ins2('leche', '23','3','4','2');
En este se inserta un cero en la columna del registro donde
no coincide el tipo de dato.
# Llamada el SP incorrecto el registro
call ins('leche', 'ss','3','2','7');

Tarea

  • 1.
    Universidad Tecnológica deTehuacán Ing. en Tecnologías de la Información y Comunicación Base de Datos para Aplicaciones «Transacciones y Stored Procedures» Ing. Octavio Sánchez Delgado TSU Vera Sosa Guillermina 8° A enero-abril 2013 24 de enero de 2013
  • 2.
    Transacciones Son operaciones quese realizan en un bloque, para ello se utiliza: «Begin» o «start» para iniciar una transacción. «Rollback» para cancelar y regresar al estado final. «Commit» para confirmar la transacción y finalizar la transacción. Por lo tanto una transacción se define para cumplir las restricciones de integridad de la base de datos.
  • 3.
    Propiedades Atomicidad: Confirmación automáticade todas las transacciones. Consistencia: Que se vean reflejados los cambios realizados. Aislamiento: de manera independiente no comparten información entre ellas, por lo tanto realizan primero sus operaciones y luego las suyas. Durabilidad: Asegurar que la información es correcta. Una vez confirmado los cambios ya no se desaceran los cambios, por lo tanto se mantendrá la información.
  • 4.
    Ventajas de usartransacciones Permite recuperar de errores como: Servidores pasmados Falta de energía Errores ajenos a la base de datos Errores de la base de datos Consultas mal ejecutadas Para lo cual puedes ejecutar operaciones y ver los resultados y si estas de acuerdo entonces finalizas con un commit.
  • 5.
    Ejemplo de unatransacción Begin Insert into tb2 values(2,’Silla’); Select *from tb2; Commit; End; En este ejemplo se inicia la transacción, luego se inserta un registro en la tabla tb2, después se realiza una consulta y finalmente se cierra la finalización.
  • 6.
    Procedimientos almacenados Es unconjunto de operaciones o comandos que pueden almacenarse en el servidor. Una vez almacenados puedes acceder y utilizar para realizar una o varias operaciones especificas con el mismo Stored Procedures. Dentro de un procedimiento podemos hacer uso de una o varias transacciones especificas. Para llamar un Stored Procedures se utiliza el call y el nombre del Stored Procedures.
  • 7.
    Estructura Parautilizar un stored procedure cambiamos el delimitador para que no nos mande error en las sentencias del procedimiento. Delimiter // #Cambiar el delimitador para que no genere errores Create Procedure nombre_SP(Parametros) Begin #iniciar el SP [Conjunto de operaciones o sentencias] End; #Cerrar el SP
  • 8.
    Ejemplo Ejecutando un storeden MySQL se realizaría así. mysql> delimiter // mysql> CREATE PROCEDURE simpleproc (OUT param1 INT) -> BEGIN -> SELECT COUNT(*) INTO param1 FROM t; -> END -> // Query OK, 0 rows affected (0.00 sec) mysql> delimiter ;
  • 9.
    Manejador de errores«Handler» Es invocado cuando se da un evento o condición definida con anterioridad. Este evento está siempre asociado con una condición de error, pero puedes tener tres formas de definir el error: Como código de error de MySQL Como código SQLSTATE ANSI-standard Como nombre de condición, ejemplo: SQLEXCEPTION,SQLWARNING y NOT FOUND.
  • 10.
    SQLWARNING es unaabreviación para todos los códigos SQLSTATE que comienzan con 01. NOT FOUND es una abreviación para todos los códigos SQLSTATE que comienzan con 02. SQLEXCEPTION es una abreviación para todos los códigos SQLSTATE no tratados por SQLWARNING o NOT FOUND. En el comando Handler podemos manejar una o varias condiciones . Si una o varias condiciones se cumplen entonces se ejecuta el comando que se especifique. Handler CONTINUE : continúa la rutina actual tras la ejecución del comando del handler. Handler EXIT , termina la ejecución del comando compuesto BEGIN...END actual. Handler UNDO: todavía no se soporta.
  • 11.
    Para tratar erroresespecíficos Podemos utilizar la siguente estructura para un error en especifico: DECLARE condition_name CONDITION FOR condition_value condition_value: SQLSTATE [VALUE] sqlstate_value | mysql_error_code
  • 12.
    Para tratar varioserrores DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement handler_type: CONTINUE | EXIT | UNDO condition_value: SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code
  • 13.
    mysql> create procedurepstar () begin declare v int; declare exit handler for sqlexception select 'SQLEXCEPTION'; drop table if exists tstar; create table tstar (s1 int, s2 char(1)); set v = 0; while TRUE do insert into tstar values (null,null); end while; end// En este ejemplo si cacha un error de una tabla, borra la tabla después la crea, compara el valor de la variable y mientras exista crea un registro en la tabla.
  • 14.
    Scripts para manejarerrores Los dos siguientes script son un ejemplo de cómo hacer el manejo de los errores, con procedimientos almacenados, transacciones y el uso del If dentro de los procedimientos almacenados. Para esto se utilizó la tabla de productos de la base de datos ventas.
  • 15.
    Handler Exit #Procedimiento para controlar el error de cuando se inserta una llave foránea que no existe. CREATE PROCEDURE ins2(nom varchar(100), prec double, num int(11), cat int, prove int) #Creación del procedimiento con la declaración de variables BEGIN #inicio del SP BEGIN #Inicio de la transacción DECLARE x INT DEFAULT 0; #declaración de x DECLARE EXIT HANDLER FOR SQLSTATE '23000' SET x=2; #declaración del manejador de error y si lo cacha tomara el valor 2. insert into producto (Nombre, Precio, Stock, idCategoria, idProveedor) values(nom, prec, num, cat, prove); #Inserción del producto IF x = 2 THEN #inicio del IF ROLLBACK; #Se deshacen los registros realizados SELECT CONCAT('ERROR al insertar una llave foránea que no existe'); #Mensaje sobre el Error else COMMIT; #Se confirma la inserción sino hay error END IF; #inicio del IF END; #Inicio de la transacción END; #fin del SP
  • 16.
    Ejecución del procedimientocon Handler # Llamada el SP correcto el registro call ins2('leche', '23','3','4','2'); En esta llamada el registro se realizara correctamente y no se utilizara el manejador de error del SP. # Llamada el SP incorrecto el registro call ins2('leche', '23','3','d','7'); En esta llamada en la penúltima columna es una llave foránea, y el tipo de dato tampoco corresponde, por lo cual se ejecutara el manejador de error y no hará el registro.
  • 17.
    Handler Continue Error:1054. Los tipos de datos de los campos no son los definidos, se colocara un cero en el campo del registro. CREATE PROCEDURE ins3(nom varchar(100), prec double, num int(11), cat int, prove int) #Creación del procedimiento con la declaración de variables BEGIN #inicio del SP BEGIN #inicio de la transacción DECLARE x INT DEFAULT 0;#declaración de la variable DECLARE CONTINUE HANDLER FOR 1054 SET x = 1; #Declaración del handler insert into producto (Nombre,Precio,Stock,idCategoria,idProveedor) values (nom, prec, num, cat, prove); #Inserción del registro SELECT CONCAT('los tipos de datos de los campos no son los definidos y se colocara un cero en el campo') as "Resultado"; #Impresión del mensaje de error IF x = 1 then SELECT CONCAT('WARNING: error') as 'Resultado'; COMMIT; #Confirma ejecución END IF; #fin del IF END; #Fin de la transacción END; #Fin del SP
  • 18.
    Ejecución del procedimientocon Handler En este manejo de error se esta insertando un registro correcto por lo tanto no se utilizara el manejador de error . # Llamada al SP correcto el registro call ins2('leche', '23','3','4','2'); En este se inserta un cero en la columna del registro donde no coincide el tipo de dato. # Llamada el SP incorrecto el registro call ins('leche', 'ss','3','2','7');