Upload
hector-lumisaca-pinduisaca
View
53
Download
1
Embed Size (px)
Citation preview
UNIVERSIDAD NACIONAL DE CHIMBORAZO
FACULTAD DE CIENCIAS DE LA EDUCACIÓN HUMANAS Y TECNOLOGIAS
ESCUELA DE: INFORMÁTICA APLICADA A LA EDUCACION
SEXTO: SEMESTRE “A”
TEMA: SENTENCIAS DE CONTROL - SUBLENGUAJES ESPECIALIZADOS
DOCENTE ING: LEONARDO AYAVACA
ALUMNO HECTOR LUMISACA
SEPTIEMBRE_MARZO 2014-2015
RIOBAMBA- ECUADOR
Estructuras de control en Transact SQL
Estructura condicional IF
La estructura condicional IF permite evaluar una expresión booleana (resultado SI - NO), y
ejecutar las operaciones contenidas en el bloque formado por BEGIN END.
IF (<expresión>)
BEGIN
...
END ELSE IF (<expresión>)
BEGIN
...
END
ELSE
BEGIN
...
END
Ejemplo de la estructura condicional IF.
DECLARE @Web varchar (100),
@diminutivo varchar (3)
SET @diminutivo = 'DJK'
IF @diminutivo = 'DJK'
BEGIN
PRINT 'www.devjoker.com'
END
ELSE
BEGIN
PRINT 'Otra Web (peor!)'
END
La estructura IF admite el uso de sub consultas:
DECLARE @coPais int,
@descripción varchar(255)
set @coPais = 5
set @descripción = 'España'
IF EXISTS(SELECT * FROM PAISES
WHERE CO_PAIS = @coPais)
BEGIN
UPDATE PAISES
SET DESCRIPCION = @descripción
WHERE CO_PAIS = @coPais
END
ELSE
BEGIN
INSERT INTO PAISES
(CO_PAIS, DESCRIPCION) VALUES
(@coPais, @descripción)
END
Estructura condicional CASE
La estructura condicional CASE permite evaluar una expresión y devolver un valor u otro.
La sintaxis general de case es:
CASE <expresión>
WHEN <valor expresión> THEN <valor devuelto>
WHEN <valor expresión> THEN <valor devuelto>
ELSE <valor devuelto> -- Valor por defecto
END
Ejemplo de CASE.
DECLARE @Web varchar(100),
@diminutivo varchar(3)
SET @diminutivo = 'DJK'
SET @Web = (CASE @diminutivo
WHEN 'DJK' THEN 'www.devjoker.com'
WHEN 'ALM' THEN 'www.aleamedia.com'
ELSE 'www.devjoker.com'
END)
PRINT @Web
Otra sintaxis de CASE nos permite evaluar diferentes expresiones:
CASE
WHEN <expresión> = <valor expresión> THEN <valor devuelto>
WHEN <expresión> = <valor expresión> THEN <valor devuelto>
ELSE <valor devuelto> -- Valor por defecto
END
El mismo ejemplo aplicando esta sintaxis:
DECLARE @Web varchar(100),
@diminutivo varchar(3)
SET @diminutivo = 'DJK'
SET @Web = (CASE
WHEN @diminutivo = 'DJK' THEN 'www.devjoker.com'
WHEN @diminutivo = 'ALM' THEN 'www.aleamedia.com'
ELSE 'www.devjoker.com'
END)
PRINT @Web
Otro aspecto muy interesante de CASE es que permite el uso de subconsultas.
DECLARE @Web varchar(100),
@diminutivo varchar(3)
SET @diminutivo = 'DJK'
SET @Web = (CASE
WHEN @diminutivo = 'DJK' THEN (SELECT web
FROM WEBS
WHERE id=1)
WHEN @diminutivo = 'ALM' THEN (SELECT web
FROM WEBS
WHERE id=2)
ELSE 'www.devjoker.com'
END)
PRINT @Web
Bucle WHILE
El bucle WHILE se repite mientras expresión se evalue como verdadero.
Es el único tipo de bucle del que dispone Transact SQL.
WHILE <expresión>
BEGIN
...
END
Un ejemplo del bucle WHILE.
DECLARE @contador int
SET @contador = 0
WHILE (@contador < 100)
BEGIN
SET @contador = @contador + 1
PRINT 'Iteración del bucle ' + cast(@contador AS varchar)
END
Podemos pasar a la siguiente iteración del bucle utilizando CONTINUE.
DECLARE @contador int
SET @contador = 0
WHILE (@contador < 100)
BEGIN
SET @contador = @contador + 1
IF (@contador % 2 = 0)
CONTINUE
PRINT 'Iteración del bucle ' + cast(@contador AS varchar)
END
El bucle se dejará de repetir con la instrucción BREAK.
DECLARE @contador int
SET @contador = 0
WHILE (1 = 1)
BEGIN
SET @contador = @contador + 1
IF (@contador % 50 = 0)
BREAK
PRINT 'Iteración del bucle ' + cast(@contador AS varchar)
END
También podemos utilizar el bucle WHILE conjuntamente con sus consultas.
DECLARE @coRecibo int
WHILE EXISTS (SELECT *
FROM RECIBOS
WHERE PENDIENTE = 'S')-- Ojo, la subconsulta se ejecuta
-- una vez por cada iteración
-- del bucle!
BEGIN
SET @coRecibo = (SELECT TOP 1 CO_RECIBO
FROM RECIBOS WHERE PENDIENTE = 'S')
UPDATE RECIBOS
SET PENDIENTE = 'N'
WHERE CO_RECIBO = @coRecibo
END
Estructura GOTO
La sentencia goto nos permite desviar el flujo de ejecución hacia una etiqueta. Fue muy
utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema
@@ERROR para el control de errores.
Actualmente, se desaconseja el uso GOTO, recomendándose el uso de TRY - CATCH para la
gestión de errores.
DECLARE @divisor int,
@dividendo int,
@resultado int
SET @dividendo = 100
SET @divisor = 0
SET @resultado = @dividendo/@divisor
IF @@ERROR > 0
GOTO error
PRINT 'No hay error'
RETURN
error:
PRINT 'Se ha producido una división por cero'
(herrate, 2006)
TRANSACCIÓN (BASE DE DATOS)
La transacción es una conjunto de instrucciones la cual tiene que realizar todas sus instrucciones
o ninguna de ellas, teniendo esta definición también se puede decir que la transacción es una
unidad lógica de trabajo.
Cada transacción debe tener las propiedades ACID.
Ahora ¿Cuáles son estas propiedades ACID?
Propiedades ACID
Propiedad Descripción
Atomicidad La transacción es realizada completamente o no realiza ninguna acción.
No puede realizar solamente mitad o parte de la transacción.
Consistencia Solo son ejecutadas aquellas transacciones que no tiene conflicto con las
reglas y directrices de integridad de la base de datos.
Aislamiento Si hay dos o más transacciones que en un mismo tiempo desean realizar
cambio a una misma información, el sistema garantiza que cada
Propiedades ACID
Propiedad Descripción
transacción ignora al resto de las transacciones es decir que cada una se
maneja de forma independiente para no generar errores.
Durabilidad
Cuando una transacción es exitosa los cambios hechos por la transacción
permanecen en el sistema y no se pueden deshacer aunque falle el
sistema.
Regularmente las transacciones comienzan con un BEGIN WORK y finalizan con un
COMMIT/COMMIT WORK o ROLLBACK/ROLLBACK WORK.
Ejemplo:?
3
4
5
6
7
BEGIN WORK
UPDATE Tabla SET dato = '15' WHERE dato2 = 'Manolo
DELETE FROM dato = 'Manolo'
COMMIT WORK
Hay otra manera de escribir una transacción estas son las transacciones ANSI, estas comienzan
cuando inicia cualquier sentencia SQL y finaliza con un COMMIT o ROLLBACK.
Ejemplo:
1
2
3
4
5
6
UPDATE Tabla SET dato = '15' WHERE dato2 = 'Manolo'
DELETE FROM dato = 'Manolo'
COMMIT
(Cuesi, 2012)
3.2. LAS AUTORIZACIONES Y DESAUTORIZACIONES
Todos los privilegios sobre la base de datos los tiene su propietario, pero no es el único que accede
a ésta. Por este motivo, el SQL nos ofrece sentencias para autorizar y desautorizar a otros usuarios.
1) Autorizaciones
Para autorizar, el SQL dispone de la siguiente sentencia:
Donde tenemos que: a) privilegios puede ser:
•ALL PRIVILEGES: todos los privilegios sobre el objeto especificado.
•USAGE: utilización del objeto especificado; en este caso el dominio.
•SELECT: consultas.
•INSERT [(columnas)]: inserciones. Se puede concretar de qué columnas.
•UPDATE [(columnas)]: modificaciones. Se puede concretar de qué columnas.
•DELETE: borrados.
•REFERENCES [(columna)]: referencia del objeto en restricciones de integri-dad. Se puede
concretar de qué columnas) Objeto debe ser:
•DOMAIN: dominio
SET TRANSACTION READ WRITE;
UPDATE empleados SET sueldo = sueldo – 1000 WHERE num_proyec = 3;
UPDATE empleados SET sueldo = sueldo + 1000 WHERE num_proyec = 1;
COMMIT; GRANT privilegios ON objeto TO usuarios
[WITH GRANT OPTION];
•TABLE: tabla.
•Vista.
c) Usuarios puede ser todo el mundo: PUBLIC, o bien una lista de los identi-ficadores de los
usuarios que queremos autorizar.
d) La opción WITH GRANT OPTION permite que el usuario que autoricemos pueda, a su vez,
autorizar a otros usuarios a acceder al objeto con los mismos privilegios con los que ha sido
autorizado.
2) Desautorizaciones
Para desautorizar, el SQL dispone de la siguiente sentencia:
Donde tenemos que: a) privilegios, objeto y usuarios son los mismos que para la sentencia
GRANT.
b) La opción
GRANT OPTION FOR se utilizaría en el caso de que quisiéramos eliminar el derecho a autorizar
(WITH GRANT OPTION).
c) Si un usuario al que hemos autorizado ha autorizado a su vez a otros, que al mismo tiempo
pueden haber hecho más autorizaciones, la opción
CASCADE hace que queden desautorizados todos a la vez.
d) La opción
RESTRICT no nos permite desautorizar a un usuario si éste ha autorizado a otros.
REVOKE [GRANTOPTIONFOR] privilegios ON objeto FROM usuarios
[RESTRICTCASCADE];
4. SUBLENGUAJES ESPECIALIZADOS
Muchas veces querremos acceder a la base de datos desde una aplicación he-cha en un lenguaje
de programación cualquiera. Para utilizar el SQL desde un lenguaje de programación, podemos
utilizar el SQL hospedado, y para traba-jar con éste necesitamos un pre compilador que separe
las sentencias del len-guaje de programación de las del lenguaje de bases de datos. Una alternativa
muy interesante a esta forma de trabajar son las rutinas SQL/CLI.
El objetivo de este apartado no es explicar con detalle ni el SQL hospedado ni, aún menos, las
rutinas SQL/CLI. Sólo introduciremos las ideas básicas del funcionamiento de ambos.
4.1. SQL hospedado
Para crear y manipular una base de datos relacional necesitamos SQL. Además, si la tarea que
queremos hacer requiere el poder de procesamiento de un len-guaje de programación como Java,
C, Cobol, Fortran, Pascal, etc., podemos utilizar el SQL hospedado en el lenguaje de
programación elegido. De este mo-do, podemos utilizar las sentencias del SQL dentro de nuestras
aplicaciones, poniendo siempre delante la palabra reservada
EXEC SQL*.
Para poder compilar la mezcla de llamadas de SQL y sentencias de programa-ción, antes tenemos
que utilizar un precompilador. Un precompilador es una herramienta que separa las sentencias
del SQL y las sentencias de programa-ción. Allá donde en el programa fuente haya una sentencia
de acceso a la base de datos, se debe insertar una llamada a la interfaz del SGBD. El programa
fuente resultante de la precompilación ya está únicamente en el lenguaje de programa-ción,
preparado para ser compilado, montado y ejecutado.
En la figura que encontraréis en la página siguiente podéis observar este funcionamiento.
Todas las sentencias de definición, manipulación y control que hemos visto para el SQL se pueden
utilizar en el SQL hospedado, pero precedidas de la cláu-sula
EXEC SQL. Sólo habrá una excepción: cuando el resultado de una sentencia SQL obtenga más
de una fila o haga referencia también a más de una, deberemos trabajar con el concepto de cursor.
Un cursor se tiene que haber declarado antes de su utilización (EXEC SQL DECLARE
nombre_cursor CURSORFOR). Para utilizarlo, se debe abrir (EXEC SQL OPEN
nombre_cursor), ir tomando los datos uno a uno, tratarlos * Puede haber pequeñas diferencias
dependiendo del lenguaje de programación concreto que estemos considerando.
(EXEC SQL FETCH nombre_cursor INTO), y finalmente, cerrarlo (EXEC SQL CLOSE
nombre_cursor).
4.2. Las SQL/CLI
Las SQL/CLI (
SQL/Call-Level Interface), denominadas de forma abreviada CLI, permiten que aplicaciones
desarrolladas en un cierto lenguaje de programa-ción (con sólo las herramientas disponibles para
este lenguaje y sin el uso de un precompilador) puedan incluir sentencias SQL mediante llamadas
a libre-rías. Estas sentencias SQL se deben interpretar en tiempo de ejecución del programa, a
diferencia del SQL hospedad o, que requería el uso de un pre-compilador.
La interfaz ODBC(Open Database Connectivity) define una librería de funciones que permite a
las aplicaciones acceder al SGBD utilizando el SQL. Las rutinas
SQL/CLI están fuertemente basadas en las características de la interfaz ODBC, y gracias al trabajo
desarrollado por SAG-X/Open (SQL Access Group-X/Open), fueron añadidas al estándar
ANSI/ISO SQL92 en 1995.
Las SQL/CLI son simplemente rutinas que llaman al SGBD para interpretar las sentencias SQL
que pide la aplicación. Desde el punto de vista del SGBD, las SQL/CLI se pueden considerar,
simplemente, como otras aplicaciones.
(Escofet, 2006)
Bibliografía
Cuesi, J. J. (20 de 01 de 2012). google. Obtenido de bloger: http://aprendiendo-
software.blogspot.com/2012/01/transaccion-base-de-datos.html
Escofet, C. M. (5 de 11 de 2006). google. Obtenido de pdf: http://ocw.uoc.edu/computer-
science-technology-and-multimedia/bases-de-datos/bases-de-
datos/P06_M2109_02149.pdf
herrate, p. (6 de 12 de 2006). google. Recuperado el 19 de 01 de 2015, de blogger:
http://www.devjoker.com/contenidos/articulos/234/Estructuras-de-control-en-
Transact-SQL.aspx