7090112 Clase Transact Sql Server

984 views

Published on

Curso de SQL

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
984
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
72
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

7090112 Clase Transact Sql Server

  1. 1. Transact SQL Server Ingeniería Informática IPP
  2. 2. Identificadores de objetos de base de datos <ul><li>[[[ server . ][ database] . ][ owner] . ] database_object </li></ul><ul><li>􀁺 Server: </li></ul><ul><ul><li>El nombre del servidor </li></ul></ul><ul><li>􀁺 Database: </li></ul><ul><ul><li>Nombre de la base de datos que gestiona el servidor </li></ul></ul><ul><li>Owner: </li></ul><ul><ul><li>Es el propietario de ese objeto </li></ul></ul><ul><li>Database_object: </li></ul><ul><ul><li>El nombre del objeto de la base de datos </li></ul></ul>
  3. 3. Tipos de datos <ul><li>Los tipos de datos definidos por los usuarios se definen como </li></ul><ul><li>siguen </li></ul><ul><li>􀁺 Exec sp_addtype Phone, varchar(20), 'NOT NULL' </li></ul><ul><li>􀁺 Exec sp_addtype typPostalCode, varchar(7), 'NULL' -- in Canada </li></ul><ul><li>􀁺 Exec sp_addtype </li></ul><ul><li>Es el nombre del procedimiento almacenado que nos permite definir un tipo de datos Phone ó typPostalCode es el nombre del tipo de datos que estamos creando. </li></ul>
  4. 4. Variables locales <ul><li>El ámbito de las VL es el procedimiento almacenado donde se declaran </li></ul><ul><li>􀁺 Se definen así: </li></ul><ul><ul><li>Declare @LastName varchar(50) </li></ul></ul><ul><ul><li>Declare @LastName varchar(50), </li></ul></ul><ul><ul><li>@FirstName varchar(30), </li></ul></ul><ul><ul><li>@BirthDate smalldatetime </li></ul></ul><ul><li>􀁺 Variables definidas según tipo de datos construido por el usuario </li></ul><ul><ul><li>Declare @OfficePhone phone </li></ul></ul>
  5. 5. Variables locales <ul><li>La asignación de valores se realiza con la sentencia </li></ul><ul><li>SELECT </li></ul><ul><li>􀁺 Select @LastName = 'Smith' </li></ul><ul><li>􀁺 Se pueden realizar varias asignaciones a la vez </li></ul><ul><li>􀁺 Select @LastName = 'Smith', </li></ul><ul><li>@FirstName = 'David', </li></ul><ul><li>@BirthDate = '2/21/1965' </li></ul>
  6. 6. Variables locales <ul><li>􀁺 Declare @make varchar(50), @model varchar(50), </li></ul><ul><li>@EqType varchar(50) </li></ul><ul><li>􀁺 </li></ul><ul><li>Select @Make = 'ACME', @Model = 'Turbo', </li></ul><ul><li>@EqType = 'cabadaster' </li></ul><ul><li>􀁺 Select @Make = make, @Model = Model, </li></ul><ul><li>@EqType = EqType.EqType </li></ul><ul><li>􀁺 From EqType INNER JOIN Equipment </li></ul><ul><li>􀁺 ON EqType.EqTypeId = Equipment.EqTypeId </li></ul><ul><li>􀁺 Where EquipmentId = -1 </li></ul><ul><li>􀁺 </li></ul><ul><li>Select @make make, @model model, @EqType EqType </li></ul>
  7. 7. Variables locales <ul><li>􀁺 SQL Server permite asignar valores a las variables </li></ul><ul><li>dentro de una sentencia de actualización </li></ul><ul><li>􀁺 Update Inventory </li></ul><ul><li>Set @mnsCost = Cost = Cost * @fltTaxRate </li></ul><ul><li>Where InventoryId = @intInventoryId </li></ul>
  8. 8. Variables Globales <ul><li>No las definimos </li></ul><ul><li>􀁺 El servidor las mantiene por nosotros </li></ul><ul><li>􀁺 @@identity </li></ul><ul><li>– Almacena el código interno de identificación de un registro </li></ul><ul><li>– Almacena el último código de la última inserción </li></ul><ul><li>􀁺 @@error </li></ul><ul><li>– 0 = No existe error </li></ul><ul><li>– Otro valor = Indica el código del error </li></ul><ul><li>􀁺 @@rowcount </li></ul><ul><li>– Número de registros afectados en la última sentencia. </li></ul>
  9. 9. Variables de tipo tabla <ul><li>Declare @MyTableVar table (Id int primary key, Lookup </li></ul><ul><li>varchar(15)) </li></ul><ul><li>􀁺 Insert @MyTableVar values (1, '1Q2000') </li></ul><ul><li>􀁺 Insert @MyTableVar values (2, '2Q2000') </li></ul><ul><li>􀁺 Insert @MyTableVar values (3, '3Q2000') </li></ul><ul><li>􀁺 Select * from @MyTableVar </li></ul>
  10. 10. Variables de tipo tabla <ul><li>Las VT solo pueden aparecer como parte de las sentencias Select, Update, </li></ul><ul><li>􀁺 Delete, Insert, y Cursores. </li></ul><ul><li>􀁺 No pueden aparecer en sentencias SELECT de inserción Select...Into: </li></ul><ul><ul><ul><li>Select LookupId, Lookup </li></ul></ul></ul><ul><ul><ul><li>Into @TableVariable -- wrong </li></ul></ul></ul><ul><ul><ul><li>From Lookup </li></ul></ul></ul><ul><li>􀁺 No puede aparecer en sentencias de inserción que utilicen procedimientos </li></ul><ul><li>alamcenados: </li></ul><ul><ul><ul><li>Insert into @TableVariable -- wrong </li></ul></ul></ul><ul><ul><ul><li>Exec prMyProcedure </li></ul></ul></ul><ul><li>􀁺 A diferencia de las tablas temporales, las VT tienen un alcance local. Solo </li></ul><ul><li>pueden ser utilizados en el ámbito donde fueron creadas. </li></ul><ul><li>􀁺 Los cursores basados en VT tienen un alcance local </li></ul><ul><li>􀁺 Las VT no son objetos persistentes y no se pueden deshacer sus cambios </li></ul><ul><li>con una sentencia Rollback </li></ul>
  11. 11. Procedimientos de Almacenado <ul><li>Son procedimientos que se encuentran compilados y almacenados en el DBMS. </li></ul><ul><li>Pueden realizar operaciones de mantenimiento, actualización, </li></ul><ul><li>inserción, eliminación y consulta. </li></ul><ul><li>Pueden recibir par´ametros para realizar sus tareas. </li></ul><ul><li>Son excelentes para mantener seguridad, encapsulamiento y para aumentar la eficiencia de las aplicaciones que funcionan con </li></ul><ul><li>interacción con DBMS. </li></ul>
  12. 12. Procedimientos de Almacenado <ul><li>Para crear un procedimiento almacenado usamos create. </li></ul><ul><li>almacenados en el DBMS. </li></ul><ul><ul><ul><li>create procedure miprocedimiento @parametro1 tipo1, ... </li></ul></ul></ul><ul><ul><ul><li>as </li></ul></ul></ul><ul><ul><ul><li>begin </li></ul></ul></ul><ul><ul><ul><li>... </li></ul></ul></ul><ul><ul><ul><li>end </li></ul></ul></ul><ul><li>Un procedimiento no tiene un valor de retorno, pero puede producir resultado en la forma de una o varias consultas. </li></ul>
  13. 13. Restricciones de Integridad <ul><li>Hasta ahora los tipos de restricciones de integridad que hemos </li></ul><ul><li>visto usan un modelo estático, dependen de valores constantes. </li></ul><ul><li>Son controladas cada vez que el elemento asociado cambia (en cualquier forma). </li></ul><ul><li>Hemos usado: </li></ul><ul><ul><ul><li>• Restricciones de unicidad – llaves primarias. </li></ul></ul></ul><ul><ul><ul><li>• Restricciones referenciales – llaves for´aneas. </li></ul></ul></ul><ul><ul><ul><li>• Restricciones de dominio – formatos de strings, rangos de </li></ul></ul></ul><ul><ul><ul><li>valores, etc. </li></ul></ul></ul><ul><li>Las restricciones que hemos visto, son impuestas por el diseñador de la BD y ejecutadas por el DBMS. </li></ul>
  14. 14. Sentencias de control de flujo <ul><li>􀁺 If </li></ul><ul><li>􀁺 While </li></ul><ul><li>􀁺 Break </li></ul><ul><li>􀁺 Continue </li></ul><ul><li>􀁺 GoTo </li></ul><ul><li>􀁺 WaitFor </li></ul>
  15. 15. Sentencias de control de flujo IF <ul><li>􀁺 Esta sentencia cambia el flujo de ejecución </li></ul><ul><li>􀁺 If boolean_expression </li></ul><ul><li>􀁺 { Transact-SQL_statement | statement_block} </li></ul><ul><li>􀁺 [else </li></ul><ul><li>􀁺 { Transact-SQL_statement | statement_block}] </li></ul><ul><li>􀁺 El valor True=Cierto=Verdadero=1 </li></ul><ul><li>􀁺 El valor False=Falso=0 </li></ul><ul><li>􀁺 Si el valor es cierto ejecuta el primer bloque de sentencias, sino el segundo </li></ul>
  16. 16. Ejemplo <ul><li>WHILE @@FETCH_STATUS = 0 </li></ul><ul><li> BEGIN </li></ul><ul><li> UPDATE MON_MONITOREO </li></ul><ul><li> SET CANTIDAD = isnull(CANTIDAD,0) + 1 </li></ul><ul><li> WHERE CAMP_NOMBRE = @CAMPANA </li></ul><ul><li>--- AND CODEJECUTIVO = @CODEJEC </li></ul><ul><li> AND INDICE = @INDICE </li></ul><ul><li> IF @CORTIPOVTA = 'TIT' </li></ul><ul><li> BEGIN </li></ul><ul><li> UPDATE MON_MONITOREO </li></ul><ul><li> SET TITULAR = isnull(TITULAR,0) + 1 </li></ul><ul><li> WHERE CAMP_NOMBRE = @CAMPANA </li></ul><ul><li>--- AND CODEJECUTIVO = @CODEJEC </li></ul><ul><li> AND INDICE = @INDICE </li></ul><ul><li> END </li></ul><ul><li> IF @CORTIPOVTA = 'ADI' </li></ul><ul><li> BEGIN </li></ul><ul><li> UPDATE MON_MONITOREO </li></ul><ul><li> SET ADICIONAL = isnull(ADICIONAL,0) + 1 </li></ul><ul><li> WHERE CAMP_NOMBRE = @CAMPANA </li></ul><ul><li>--- AND CODEJECUTIVO = @CODEJEC </li></ul><ul><li> AND INDICE = @INDICE </li></ul><ul><li> END </li></ul><ul><li> FETCH NEXT FROM ventas </li></ul><ul><li> INTO @CAMPANA, @CODEJEC, @INDICE, @CORTIPOVTA </li></ul><ul><li> END </li></ul><ul><li> CLOSE ventas </li></ul><ul><li> DEALLOCATE ventas </li></ul>
  17. 17. Sentencias de control de flujo IF con subconsultas <ul><li>􀁺 Otra forma de utilizar las consultas </li></ul><ul><li>􀁺 If [NOT] Exists(subquery) </li></ul><ul><li>􀁺 {Transact-SQL_statement | statement_block} </li></ul><ul><li>􀁺 [else </li></ul><ul><li>􀁺 {Transact-SQL_statement | statement_block}] </li></ul>
  18. 18. Sentencias de control de flujo While <ul><li>While Boolean_expression </li></ul><ul><ul><li>{sql_statement | statement_block} </li></ul></ul><ul><ul><li>[Break] </li></ul></ul><ul><ul><li>{sql_statement | statement_block} </li></ul></ul><ul><ul><li>[Continue] </li></ul></ul><ul><ul><li>{sql_statement | statement_block} </li></ul></ul><ul><ul><li>{Resto de instrucciones} </li></ul></ul><ul><li>􀁺 True = 1 False = 0 </li></ul><ul><li>􀁺 Break. El servidor interrumpe el bucle y salta a la siguiente </li></ul><ul><li>instrucción después del bucle. {Resto de instrucciones} </li></ul><ul><li>􀁺 Continue. El servidor vuelve inmediatamente a la guarda del bucle, </li></ul><ul><li>ignorando el resto de instrucciones por ejecutar después de la </li></ul><ul><li>sentencia continue. Boolean_expression </li></ul>
  19. 19. Sentencias de control de flujo Ejemplo de la instrucción While <ul><li>Create Procedure prCalcFactorial </li></ul><ul><li>-- calculate factorial </li></ul><ul><li>-- 1! = 1 </li></ul><ul><li>-- 3! = 3 * 2 * 1 </li></ul><ul><li>-- n! = n * (n-1)* . . . 5 * 4 * 3 * 2 * 1 </li></ul><ul><li>@N tinyint, </li></ul><ul><li>@F int OUTPUT </li></ul><ul><li>As </li></ul><ul><li>Set @F = 1 </li></ul><ul><li>while @N > 1 </li></ul><ul><li>begin </li></ul><ul><ul><ul><li>set @F = @F * @N </li></ul></ul></ul><ul><ul><ul><li>Set @N = @N - 1 </li></ul></ul></ul><ul><li>end </li></ul><ul><li>return 0 </li></ul>
  20. 20. Cursores <ul><li>conjuntos de datos </li></ul><ul><li>Las aplicaciones de usuario estan deseñadas para mostrar conjuntos </li></ul><ul><li>de datos por registros </li></ul><ul><li>Los cursores unen estos dos enfoques </li></ul><ul><li>Tenemos tres tipos de cursores en SQL Server </li></ul><ul><ul><ul><li>– Client cursors </li></ul></ul></ul><ul><ul><ul><li>– API Server cursors </li></ul></ul></ul><ul><ul><ul><li>– Transact-SQL cursors </li></ul></ul></ul>
  21. 21. Cursores Transact-SQL vs Resto de cursores <ul><li>La finalidad de los cursores es su principal diferencia </li></ul><ul><li>􀁺 Transact-SQL se utiliza en: </li></ul><ul><li>– Los procedimientos almacenados </li></ul><ul><li>– Los procesos por lotes </li></ul><ul><li>– Las funciones </li></ul><ul><li>– Los disparadores </li></ul><ul><li>􀁺 El resto de cursores se utilizan desde las aplicaciones de los </li></ul><ul><li>usuarios (normalmente en forma embebida) </li></ul>
  22. 22. Cursores Transact-SQL <ul><li>􀁺 Pasos a seguir en la definición de un cursor en un procedimiento </li></ul><ul><li>almacenado </li></ul><ul><ul><li>􀁺 1. Utilizar la sentencia “Declare Cursor” para crear el cursor </li></ul></ul><ul><ul><li>􀁺 2. Llamar a la sentencia “Open” para activar el cursor </li></ul></ul><ul><ul><li>􀁺 3. Utilizar la sentencia “Fetch” para: </li></ul></ul><ul><li>– recuperar los valores a los que apunta el cursor </li></ul><ul><li>– cambiar la posición del puntero del cursor </li></ul><ul><ul><li>􀁺 4. Ahora utilizamos los valores leidos para nuestros fines </li></ul></ul><ul><ul><li>􀁺 5. Si es necesario, se repiten los pasos 3 y 4 </li></ul></ul><ul><ul><li>􀁺 6. Cerramos el cursor para </li></ul></ul><ul><li>– desbloquear los datos </li></ul><ul><li>– liberar memoria </li></ul><ul><li>– etc </li></ul><ul><li>􀁺 7. Eliminamos definitivamente el cursor </li></ul>
  23. 23. Cursores. Ejemplo Definimos los parámetros y las variables <ul><li>CREATE PROCEDURE dbo.SP_SUMAVENTASEASI (@FECHAINI AS VARCHAR(10), @FECFIN AS VARCHAR(10)) </li></ul><ul><li>AS </li></ul><ul><li>BEGIN </li></ul><ul><li>SET NOCOUNT OFF </li></ul><ul><li>DECLARE @CAMPANA VARCHAR(20) </li></ul><ul><li>DECLARE @CODEJEC VARCHAR(10) </li></ul><ul><li>DECLARE @INDICE INTEGER </li></ul><ul><li>DECLARE @CORTIPOVTA CHAR(10) </li></ul><ul><li> DECLARE ventas CURSOR FOR </li></ul><ul><li> SELECT camp_tmk, cod_agente, indice2, cor_tipopersona </li></ul><ul><li> FROM MON_VENTASEASI </li></ul><ul><li> WHERE fec_coti between @FECHAINI and @FECFIN </li></ul><ul><li> AND cod_estado in ('000','PND','PRP') </li></ul><ul><li> OPEN ventas </li></ul><ul><li> FETCH NEXT FROM ventas </li></ul><ul><li> INTO @CAMPANA, @CODEJEC, @INDICE, @CORTIPOVTA </li></ul><ul><li> </li></ul><ul><li> WHILE @@FETCH_STATUS = 0 </li></ul><ul><li> BEGIN </li></ul><ul><li> UPDATE MON_MONITOREO </li></ul><ul><li> SET CANTIDAD = isnull(CANTIDAD,0) + 1 </li></ul><ul><li> WHERE CAMP_NOMBRE = @CAMPANA </li></ul><ul><li>--- AND CODEJECUTIVO = @CODEJEC </li></ul><ul><li> AND INDICE = @INDICE </li></ul><ul><li> IF @CORTIPOVTA = 'TIT' </li></ul><ul><li> BEGIN </li></ul><ul><li> UPDATE MON_MONITOREO </li></ul><ul><li> SET TITULAR = isnull(TITULAR,0) + 1 </li></ul><ul><li> WHERE CAMP_NOMBRE = @CAMPANA </li></ul><ul><li>--- AND CODEJECUTIVO = @CODEJEC </li></ul><ul><li> AND INDICE = @INDICE </li></ul><ul><li> END </li></ul><ul><li> IF @CORTIPOVTA = 'ADI' </li></ul><ul><li> BEGIN </li></ul><ul><li> UPDATE MON_MONITOREO </li></ul><ul><li> SET ADICIONAL = isnull(ADICIONAL,0) + 1 </li></ul><ul><li> WHERE CAMP_NOMBRE = @CAMPANA </li></ul><ul><li>--- AND CODEJECUTIVO = @CODEJEC </li></ul><ul><li> AND INDICE = @INDICE </li></ul><ul><li> END </li></ul><ul><li> FETCH NEXT FROM ventas </li></ul><ul><li> INTO @CAMPANA, @CODEJEC, @INDICE, @CORTIPOVTA </li></ul><ul><li> END </li></ul><ul><li> CLOSE ventas </li></ul><ul><li> DEALLOCATE ventas </li></ul><ul><li>END </li></ul><ul><li>GO </li></ul>
  24. 24. Otro Ejemplo <ul><li>declare @nombre varchar(50) </li></ul><ul><li>declare @direccion varchar(100) </li></ul><ul><li>declare departamento_cursor cursor for </li></ul><ul><ul><li>select nombre, direccion from departamento </li></ul></ul><ul><ul><li>open departamento_cursor </li></ul></ul><ul><ul><li>fetch next from departamento_cursor into @nombre, @direccion </li></ul></ul><ul><ul><li>while @@fetch_status = 0 </li></ul></ul><ul><ul><li>begin </li></ul></ul><ul><ul><li>print(’Departamento de ’ + @nombre + ’, Direcci´on: ’ + @direccion) </li></ul></ul><ul><ul><li>fetch next from departamento_cursor into @nombre, @direccion </li></ul></ul><ul><ul><li>end </li></ul></ul><ul><ul><li>close departamento_cursor </li></ul></ul><ul><ul><li>deallocate departamento_cursor </li></ul></ul>
  25. 25. Triggers <ul><li>No son mas que un caso particular de </li></ul><ul><li>procedimiento almacenado </li></ul><ul><li>􀁺 No se pueden ejecutar directamente </li></ul><ul><li>􀁺 Se ejecutan al realizarse alguna de estas </li></ul><ul><li>operaciones </li></ul><ul><li>– Inserción Insert </li></ul><ul><li>– Modificación Update </li></ul><ul><li>– Borrado Delete </li></ul>
  26. 26. Triggers <ul><li>Create Trigger trigger_name </li></ul><ul><li>On { table | view} [With Encryption] </li></ul><ul><li>{ </li></ul><ul><li>{ </li></ul><ul><li>{For | After | Instead Of} { [Delete] [,] [Insert] [,] [Update] } </li></ul><ul><li>[With Append] </li></ul><ul><li>[Not For Replication] </li></ul><ul><li>As </li></ul><ul><li>sql_statement [...n] </li></ul><ul><li>} | </li></ul><ul><li>{(For | After | Instead Of) { [Insert] [,] [Update] } </li></ul><ul><li>[With Append] </li></ul><ul><li>[Not For Replication] </li></ul><ul><li>As </li></ul><ul><li>{ </li></ul><ul><li>If Update ( Column) </li></ul><ul><li>[{And | Or} Update ( Column)] </li></ul><ul><li>[...n] | If ( Columns_Updated() { bitwise_operator} updated_bitmask) </li></ul><ul><li>{ comparison_operator} column_bitmask [...n] } </li></ul><ul><li>sql_statement [...n] </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  27. 27. Trigger: Create trigger <ul><li>Indica al SQL Server que vamos a crear un </li></ul><ul><li>objeto en la B.D. del tipo TRIGGER </li></ul><ul><li>􀁺 La B.D. maneja objetos: triggers, store </li></ul><ul><li>procedures, tables , views </li></ul>
  28. 28. Ejemplo de Trigger <ul><li>create trigger minimo_salario_supervisor </li></ul><ul><li>on empleado </li></ul><ul><li>after update </li></ul><ul><li>as </li></ul><ul><ul><li>if update(salario) </li></ul></ul><ul><ul><li>begin </li></ul></ul><ul><ul><ul><li>update empleado </li></ul></ul></ul><ul><ul><ul><li>set salario = 500000 </li></ul></ul></ul><ul><ul><ul><li>where rut in ( </li></ul></ul></ul><ul><ul><ul><li>select rut </li></ul></ul></ul><ul><ul><ul><li>from inserted as i join supervisa_departamento as s </li></ul></ul></ul><ul><ul><ul><li>on s.empleado_rut = i.rut </li></ul></ul></ul><ul><ul><ul><li>where i.salario < 500000 ) </li></ul></ul></ul><ul><li>end </li></ul>
  29. 29. Funciones <ul><li>Usando bloques de instrucciones se pueden crear funciones de </li></ul><ul><li>usuario que pueden usarse en consultas simples. </li></ul><ul><li>Se usa el comando create function para crearlas y return </li></ul><ul><li>para el valor de retorno: </li></ul><ul><li>create function func(@parametro1 tipo1, ...) </li></ul><ul><li>returns money </li></ul><ul><li>as </li></ul><ul><ul><li>begin </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>return @valor_retorno </li></ul></ul><ul><li>end </li></ul>
  30. 30. Funciones ya Construidas <ul><li>SQLServer al igual que la mayor´ıa de los DBMS comerciales, </li></ul><ul><li>provee funciones ya construidas. </li></ul><ul><li>Funciones para manipular fechas: </li></ul><ul><li>day, month, year, getdate, dateadd,... </li></ul><ul><li>Funciones matem´aticas: abs, cos, sin, floor, ceiling,... </li></ul><ul><li>Funciones de strings: substring, lower, upper, trim,... </li></ul><ul><li>Pueden crearse funciones m´as complejas que usen estas funciones </li></ul><ul><li>para calcular su resultado. </li></ul>

×