30
Transact SQL Server Transact SQL Server Ingeniería Informática Ingeniería Informática IPP IPP

7090112-clase-transact-sql-server-090929212251-phpapp01 (1)

  • Upload
    enrique

  • View
    21

  • Download
    0

Embed Size (px)

Citation preview

Transact SQL ServerTransact SQL Server

Ingenieriacutea Informaacutetica IPPIngenieriacutea Informaacutetica IPP

Identificadores de objetosIdentificadores de objetosde base de datosde base de datos

[[[ server[[[ server][ database]][ database]][ owner]][ owner]] database_object] database_object1048698 1048698 ServerServer

ndash El nombre del servidorEl nombre del servidor1048698 1048698 DatabaseDatabase

ndash Nombre de la base de datos que gestiona el servidorNombre de la base de datos que gestiona el servidor OwnerOwner

ndash Es el propietario de ese objetoEs el propietario de ese objeto Database_objectDatabase_object

ndash El nombre del objeto de la base de datosEl nombre del objeto de la base de datos

Tipos de datosTipos de datos

Los tipos de datos definidos por los usuarios Los tipos de datos definidos por los usuarios se definen comose definen como

siguensiguen1048698 1048698 Exec sp_addtype Phone varchar(20) NOT Exec sp_addtype Phone varchar(20) NOT NULLNULL1048698 1048698 Exec sp_addtype typPostalCode Exec sp_addtype typPostalCode varchar(7) NULL -- in Canadavarchar(7) NULL -- in Canada1048698 1048698 Exec sp_addtype Exec sp_addtype

Es el nombre del procedimiento almacenado Es el nombre del procedimiento almacenado que nos permite definir un tipo de datos que nos permite definir un tipo de datos Phone oacute typPostalCode es el nombre del Phone oacute typPostalCode es el nombre del tipo de datos que estamos creando tipo de datos que estamos creando

Variables localesVariables locales

El aacutembito de las VL es el procedimiento El aacutembito de las VL es el procedimiento almacenado donde se declaranalmacenado donde se declaran

1048698 1048698 Se definen asiacuteSe definen asiacutendash Declare LastName varchar(50)Declare LastName varchar(50)ndash Declare LastName varchar(50)Declare LastName varchar(50)FirstName varchar(30)FirstName varchar(30)BirthDate smalldatetimeBirthDate smalldatetime

1048698 1048698 Variables definidas seguacuten tipo de datos Variables definidas seguacuten tipo de datos construido por el usuarioconstruido por el usuariondash Declare OfficePhone phoneDeclare OfficePhone phone

Variables localesVariables locales

La asignacioacuten de valores se realiza con La asignacioacuten de valores se realiza con la sentenciala sentencia

SELECTSELECT

1048698 1048698 Select LastName = SmithSelect LastName = Smith

1048698 1048698 Se pueden realizar varias asignaciones a la Se pueden realizar varias asignaciones a la vezvez

1048698 1048698 Select LastName = Smith Select LastName = Smith

FirstName = DavidFirstName = David

BirthDate = 2211965BirthDate = 2211965

Variables localesVariables locales

1048698 1048698 Declare make varchar(50) model varchar(50) Declare make varchar(50) model varchar(50) EqType varchar(50)EqType varchar(50)1048698 1048698 Select Make = ACME Model = Turbo Select Make = ACME Model = Turbo EqType = cabadasterEqType = cabadaster1048698 1048698 Select Make = make Model = Model Select Make = make Model = Model EqType = EqTypeEqTypeEqType = EqTypeEqType1048698 1048698 From EqType INNER JOIN EquipmentFrom EqType INNER JOIN Equipment1048698 1048698 ON EqTypeEqTypeId = EquipmentEqTypeIdON EqTypeEqTypeId = EquipmentEqTypeId1048698 1048698 Where EquipmentId = -1Where EquipmentId = -11048698 1048698 Select make make model model EqType Select make make model model EqType

EqTypeEqType

Variables localesVariables locales

1048698 1048698 SQL Server permite asignar valores a SQL Server permite asignar valores a las variableslas variables

dentro de una sentencia de dentro de una sentencia de actualizacioacutenactualizacioacuten

10486981048698 Update InventoryUpdate Inventory

Set mnsCost = Cost = Cost fltTaxRateSet mnsCost = Cost = Cost fltTaxRate

Where InventoryId = intInventoryIdWhere InventoryId = intInventoryId

Variables GlobalesVariables Globales

No las definimosNo las definimos1048698 1048698 El servidor las mantiene por nosotrosEl servidor las mantiene por nosotros1048698 1048698 identityidentityndash ndash Almacena el coacutedigo interno de identificacioacuten de un Almacena el coacutedigo interno de identificacioacuten de un

registroregistrondash ndash Almacena el uacuteltimo coacutedigo de la uacuteltima insercioacutenAlmacena el uacuteltimo coacutedigo de la uacuteltima insercioacuten1048698 1048698 errorerrorndash ndash 0 = No existe error0 = No existe errorndash ndash Otro valor = Indica el coacutedigo del errorOtro valor = Indica el coacutedigo del error1048698 1048698 rowcountrowcountndash ndash Nuacutemero de registros afectados en la uacuteltima Nuacutemero de registros afectados en la uacuteltima

sentenciasentencia

Variables de tipo tablaVariables de tipo tabla

Declare MyTableVar table (Id int primary Declare MyTableVar table (Id int primary key Lookupkey Lookup

varchar(15))varchar(15))

1048698 1048698 Insert MyTableVar values (1 1Q2000)Insert MyTableVar values (1 1Q2000)

1048698 1048698 Insert MyTableVar values (2 2Q2000)Insert MyTableVar values (2 2Q2000)

1048698 1048698 Insert MyTableVar values (3 3Q2000)Insert MyTableVar values (3 3Q2000)

1048698 1048698 Select from MyTableVarSelect from MyTableVar

Variables de tipo tablaVariables de tipo tabla

Las VT solo pueden aparecer como parte de las sentencias Select Las VT solo pueden aparecer como parte de las sentencias Select UpdateUpdate

1048698 1048698 Delete Insert y CursoresDelete Insert y Cursores1048698 1048698 No pueden aparecer en sentencias SELECT de insercioacuten SelectIntoNo pueden aparecer en sentencias SELECT de insercioacuten SelectInto

Select LookupId LookupSelect LookupId LookupInto TableVariable -- wrongInto TableVariable -- wrongFrom LookupFrom Lookup

1048698 1048698 No puede aparecer en sentencias de insercioacuten que utilicen No puede aparecer en sentencias de insercioacuten que utilicen procedimientosprocedimientos

alamcenadosalamcenadosInsert into TableVariable -- wrongInsert into TableVariable -- wrongExec prMyProcedureExec prMyProcedure

1048698 1048698 A diferencia de las tablas temporales las VT tienen un alcance local A diferencia de las tablas temporales las VT tienen un alcance local SoloSolo

pueden ser utilizados en el aacutembito donde fueron creadaspueden ser utilizados en el aacutembito donde fueron creadas1048698 1048698 Los cursores basados en VT tienen un alcance localLos cursores basados en VT tienen un alcance local1048698 1048698 Las VT no son objetos persistentes y no se pueden deshacer sus Las VT no son objetos persistentes y no se pueden deshacer sus

cambioscambioscon una sentencia Rollbackcon una sentencia Rollback

Procedimientos de AlmacenadoProcedimientos de Almacenado

Son procedimientos que se encuentran compilados y almacenados en el DBMSPueden realizar operaciones de mantenimiento actualizacioacuteninsercioacuten eliminacioacuten y consultaPueden recibir paracuteametros para realizar sus tareasSon excelentes para mantener seguridad encapsulamiento y para aumentar la eficiencia de las aplicaciones que funcionan coninteraccioacuten con DBMS

Procedimientos de AlmacenadoProcedimientos de Almacenado

Para crear un procedimiento almacenado usamos createalmacenados en el DBMS

create procedure miprocedimiento parametro1 tipo1

asbeginend

Un procedimiento no tiene un valor de retorno pero puede producir resultado en la forma de una o varias consultas

Restricciones de Integridad

Hasta ahora los tipos de restricciones de integridad que hemosvisto usan un modelo estaacutetico dependen de valores constantesSon controladas cada vez que el elemento asociado cambia (en cualquier forma)Hemos usado

bull Restricciones de unicidad ndash llaves primariasbull Restricciones referenciales ndash llaves foracuteaneasbull Restricciones de dominio ndash formatos de strings rangos devalores etc

Las restricciones que hemos visto son impuestas por el disentildeador de la BD y ejecutadas por el DBMS

Sentencias de control de flujoSentencias de control de flujo

1048698 1048698 IfIf

1048698 1048698 WhileWhile

1048698 1048698 BreakBreak

1048698 1048698 ContinueContinue

1048698 1048698 GoToGoTo

1048698 1048698 WaitForWaitFor

Sentencias de control de flujoSentencias de control de flujoIFIF

1048698 1048698 Esta sentencia cambia el flujo de ejecucioacutenEsta sentencia cambia el flujo de ejecucioacuten1048698 1048698 If boolean_expressionIf boolean_expression1048698 1048698 Transact-SQL_statement | statement_block Transact-SQL_statement | statement_block1048698 1048698 [else[else1048698 1048698 Transact-SQL_statement | statement_block] Transact-SQL_statement | statement_block]1048698 1048698 El valor True=Cierto=Verdadero=1El valor True=Cierto=Verdadero=11048698 1048698 El valor False=Falso=0El valor False=Falso=01048698 1048698 Si el valor es cierto ejecuta el primer bloque de Si el valor es cierto ejecuta el primer bloque de

sentencias sino el segundosentencias sino el segundo

EjemploEjemplo WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

Sentencias de control de flujoSentencias de control de flujoIF con subconsultasIF con subconsultas

1048698 1048698 Otra forma de utilizar las consultasOtra forma de utilizar las consultas

1048698 1048698 If [NOT] Exists(subquery)If [NOT] Exists(subquery)

10486981048698 Transact-SQL_statement | Transact-SQL_statement | statement_blockstatement_block

1048698 1048698 [else[else

1048698 1048698 Transact-SQL_statement | Transact-SQL_statement | statement_block]statement_block]

Sentencias de control de flujoSentencias de control de flujoWhileWhile

While Boolean_expressionWhile Boolean_expressionsql_statement | statement_blocksql_statement | statement_block[Break][Break]sql_statement | statement_blocksql_statement | statement_block[Continue][Continue]sql_statement | statement_blocksql_statement | statement_blockResto de instruccionesResto de instrucciones

1048698 1048698 True = 1 False = 0True = 1 False = 01048698 1048698 Break El servidor interrumpe el bucle y salta a la siguienteBreak El servidor interrumpe el bucle y salta a la siguienteinstruccioacuten despueacutes del bucle Resto de instruccionesinstruccioacuten despueacutes del bucle Resto de instrucciones1048698 1048698 Continue El servidor vuelve inmediatamente a la guarda del Continue El servidor vuelve inmediatamente a la guarda del

buclebucleignorando el resto de instrucciones por ejecutar despueacutes de laignorando el resto de instrucciones por ejecutar despueacutes de lasentencia continue Boolean_expressionsentencia continue Boolean_expression

Sentencias de control de flujoSentencias de control de flujoEjemplo de la instruccioacuten WhileEjemplo de la instruccioacuten While

Create Procedure prCalcFactorialCreate Procedure prCalcFactorial-- calculate factorial-- calculate factorial-- 1 = 1-- 1 = 1-- 3 = 3 2 1-- 3 = 3 2 1-- n = n (n-1) 5 4 3 2 1-- n = n (n-1) 5 4 3 2 1

N tinyintN tinyintF int OUTPUTF int OUTPUTAsAsSet F = 1Set F = 1while N gt 1while N gt 1beginbegin

set F = F Nset F = F NSet N = N - 1Set N = N - 1

endendreturn 0return 0

CursoresCursores

conjuntos de datosconjuntos de datos

Las aplicaciones de usuario estan Las aplicaciones de usuario estan desentildeadas para mostrar conjuntosdesentildeadas para mostrar conjuntos

de datos por registrosde datos por registros

Los cursores unen estos dos enfoquesLos cursores unen estos dos enfoques

Tenemos tres tipos de cursores en SQL Tenemos tres tipos de cursores en SQL ServerServer

ndash ndash Client cursorsClient cursors

ndash ndash API Server cursorsAPI Server cursors

ndash ndash Transact-SQL cursorsTransact-SQL cursors

CursoresCursoresTransact-SQL vs Resto de cursoresTransact-SQL vs Resto de cursores

La finalidad de los cursores es su La finalidad de los cursores es su principal diferenciaprincipal diferencia

1048698 1048698 Transact-SQL se utiliza enTransact-SQL se utiliza enndash ndash Los procedimientos almacenadosLos procedimientos almacenadosndash ndash Los procesos por lotesLos procesos por lotesndash ndash Las funcionesLas funcionesndash ndash Los disparadoresLos disparadores1048698 1048698 El resto de cursores se utilizan desde El resto de cursores se utilizan desde

las aplicaciones de loslas aplicaciones de losusuarios (normalmente en forma usuarios (normalmente en forma

embebida)embebida)

CursoresCursoresTransact-SQLTransact-SQL

1048698 1048698 Pasos a seguir en la definicioacuten de un cursor en un Pasos a seguir en la definicioacuten de un cursor en un procedimientoprocedimiento

almacenadoalmacenado1048698 1048698 1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1048698 1048698 2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor1048698 1048698 3 Utilizar la sentencia ldquoFetchrdquo para3 Utilizar la sentencia ldquoFetchrdquo para

ndash ndash recuperar los valores a los que apunta el cursorrecuperar los valores a los que apunta el cursorndash ndash cambiar la posicioacuten del puntero del cursorcambiar la posicioacuten del puntero del cursor

1048698 1048698 4 Ahora utilizamos los valores leidos para nuestros fines4 Ahora utilizamos los valores leidos para nuestros fines1048698 1048698 5 Si es necesario se repiten los pasos 3 y 45 Si es necesario se repiten los pasos 3 y 41048698 1048698 6 Cerramos el cursor para6 Cerramos el cursor para

ndash ndash desbloquear los datosdesbloquear los datosndash ndash liberar memorialiberar memoriandash ndash etcetc1048698 1048698 7 Eliminamos definitivamente el cursor7 Eliminamos definitivamente el cursor

Cursores EjemploCursores EjemploDefinimos los paraacutemetros y las variablesDefinimos los paraacutemetros y las variables

CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))AS AS BEGIN BEGIN

SET NOCOUNT OFF SET NOCOUNT OFF

DECLARE CAMPANA VARCHAR(20)DECLARE CAMPANA VARCHAR(20)DECLARE CODEJEC VARCHAR(10)DECLARE CODEJEC VARCHAR(10)DECLARE INDICE INTEGERDECLARE INDICE INTEGERDECLARE CORTIPOVTA CHAR(10)DECLARE CORTIPOVTA CHAR(10)

DECLARE ventas CURSOR FOR DECLARE ventas CURSOR FOR SELECT camp_tmk cod_agente indice2 cor_tipopersonaSELECT camp_tmk cod_agente indice2 cor_tipopersona FROM MON_VENTASEASIFROM MON_VENTASEASI WHERE fec_coti between FECHAINI and FECFINWHERE fec_coti between FECHAINI and FECFIN

AND cod_estado in (000PNDPRP)AND cod_estado in (000PNDPRP)

OPEN ventasOPEN ventas

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

ENDENDGOGO

Otro EjemploOtro Ejemplo

declare nombre varchar(50)declare direccion varchar(100)declare departamento_cursor cursor for

select nombre direccion from departamentoopen departamento_cursorfetch next from departamento_cursor into nombre direccionwhile fetch_status = 0begin

print(rsquoDepartamento de rsquo + nombre + rsquo Direcciacuteon rsquo + direccion)fetch next from departamento_cursor into nombre direccion

endclose departamento_cursordeallocate departamento_cursor

TriggersTriggers

No son mas que un caso particular deNo son mas que un caso particular deprocedimiento almacenadoprocedimiento almacenado1048698 1048698 No se pueden ejecutar directamenteNo se pueden ejecutar directamente1048698 1048698 Se ejecutan al realizarse alguna de Se ejecutan al realizarse alguna de

estasestasoperacionesoperacionesndash ndash Insercioacuten InsertInsercioacuten Insertndash ndash Modificacioacuten UpdateModificacioacuten Updatendash ndash Borrado DeleteBorrado Delete

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

Identificadores de objetosIdentificadores de objetosde base de datosde base de datos

[[[ server[[[ server][ database]][ database]][ owner]][ owner]] database_object] database_object1048698 1048698 ServerServer

ndash El nombre del servidorEl nombre del servidor1048698 1048698 DatabaseDatabase

ndash Nombre de la base de datos que gestiona el servidorNombre de la base de datos que gestiona el servidor OwnerOwner

ndash Es el propietario de ese objetoEs el propietario de ese objeto Database_objectDatabase_object

ndash El nombre del objeto de la base de datosEl nombre del objeto de la base de datos

Tipos de datosTipos de datos

Los tipos de datos definidos por los usuarios Los tipos de datos definidos por los usuarios se definen comose definen como

siguensiguen1048698 1048698 Exec sp_addtype Phone varchar(20) NOT Exec sp_addtype Phone varchar(20) NOT NULLNULL1048698 1048698 Exec sp_addtype typPostalCode Exec sp_addtype typPostalCode varchar(7) NULL -- in Canadavarchar(7) NULL -- in Canada1048698 1048698 Exec sp_addtype Exec sp_addtype

Es el nombre del procedimiento almacenado Es el nombre del procedimiento almacenado que nos permite definir un tipo de datos que nos permite definir un tipo de datos Phone oacute typPostalCode es el nombre del Phone oacute typPostalCode es el nombre del tipo de datos que estamos creando tipo de datos que estamos creando

Variables localesVariables locales

El aacutembito de las VL es el procedimiento El aacutembito de las VL es el procedimiento almacenado donde se declaranalmacenado donde se declaran

1048698 1048698 Se definen asiacuteSe definen asiacutendash Declare LastName varchar(50)Declare LastName varchar(50)ndash Declare LastName varchar(50)Declare LastName varchar(50)FirstName varchar(30)FirstName varchar(30)BirthDate smalldatetimeBirthDate smalldatetime

1048698 1048698 Variables definidas seguacuten tipo de datos Variables definidas seguacuten tipo de datos construido por el usuarioconstruido por el usuariondash Declare OfficePhone phoneDeclare OfficePhone phone

Variables localesVariables locales

La asignacioacuten de valores se realiza con La asignacioacuten de valores se realiza con la sentenciala sentencia

SELECTSELECT

1048698 1048698 Select LastName = SmithSelect LastName = Smith

1048698 1048698 Se pueden realizar varias asignaciones a la Se pueden realizar varias asignaciones a la vezvez

1048698 1048698 Select LastName = Smith Select LastName = Smith

FirstName = DavidFirstName = David

BirthDate = 2211965BirthDate = 2211965

Variables localesVariables locales

1048698 1048698 Declare make varchar(50) model varchar(50) Declare make varchar(50) model varchar(50) EqType varchar(50)EqType varchar(50)1048698 1048698 Select Make = ACME Model = Turbo Select Make = ACME Model = Turbo EqType = cabadasterEqType = cabadaster1048698 1048698 Select Make = make Model = Model Select Make = make Model = Model EqType = EqTypeEqTypeEqType = EqTypeEqType1048698 1048698 From EqType INNER JOIN EquipmentFrom EqType INNER JOIN Equipment1048698 1048698 ON EqTypeEqTypeId = EquipmentEqTypeIdON EqTypeEqTypeId = EquipmentEqTypeId1048698 1048698 Where EquipmentId = -1Where EquipmentId = -11048698 1048698 Select make make model model EqType Select make make model model EqType

EqTypeEqType

Variables localesVariables locales

1048698 1048698 SQL Server permite asignar valores a SQL Server permite asignar valores a las variableslas variables

dentro de una sentencia de dentro de una sentencia de actualizacioacutenactualizacioacuten

10486981048698 Update InventoryUpdate Inventory

Set mnsCost = Cost = Cost fltTaxRateSet mnsCost = Cost = Cost fltTaxRate

Where InventoryId = intInventoryIdWhere InventoryId = intInventoryId

Variables GlobalesVariables Globales

No las definimosNo las definimos1048698 1048698 El servidor las mantiene por nosotrosEl servidor las mantiene por nosotros1048698 1048698 identityidentityndash ndash Almacena el coacutedigo interno de identificacioacuten de un Almacena el coacutedigo interno de identificacioacuten de un

registroregistrondash ndash Almacena el uacuteltimo coacutedigo de la uacuteltima insercioacutenAlmacena el uacuteltimo coacutedigo de la uacuteltima insercioacuten1048698 1048698 errorerrorndash ndash 0 = No existe error0 = No existe errorndash ndash Otro valor = Indica el coacutedigo del errorOtro valor = Indica el coacutedigo del error1048698 1048698 rowcountrowcountndash ndash Nuacutemero de registros afectados en la uacuteltima Nuacutemero de registros afectados en la uacuteltima

sentenciasentencia

Variables de tipo tablaVariables de tipo tabla

Declare MyTableVar table (Id int primary Declare MyTableVar table (Id int primary key Lookupkey Lookup

varchar(15))varchar(15))

1048698 1048698 Insert MyTableVar values (1 1Q2000)Insert MyTableVar values (1 1Q2000)

1048698 1048698 Insert MyTableVar values (2 2Q2000)Insert MyTableVar values (2 2Q2000)

1048698 1048698 Insert MyTableVar values (3 3Q2000)Insert MyTableVar values (3 3Q2000)

1048698 1048698 Select from MyTableVarSelect from MyTableVar

Variables de tipo tablaVariables de tipo tabla

Las VT solo pueden aparecer como parte de las sentencias Select Las VT solo pueden aparecer como parte de las sentencias Select UpdateUpdate

1048698 1048698 Delete Insert y CursoresDelete Insert y Cursores1048698 1048698 No pueden aparecer en sentencias SELECT de insercioacuten SelectIntoNo pueden aparecer en sentencias SELECT de insercioacuten SelectInto

Select LookupId LookupSelect LookupId LookupInto TableVariable -- wrongInto TableVariable -- wrongFrom LookupFrom Lookup

1048698 1048698 No puede aparecer en sentencias de insercioacuten que utilicen No puede aparecer en sentencias de insercioacuten que utilicen procedimientosprocedimientos

alamcenadosalamcenadosInsert into TableVariable -- wrongInsert into TableVariable -- wrongExec prMyProcedureExec prMyProcedure

1048698 1048698 A diferencia de las tablas temporales las VT tienen un alcance local A diferencia de las tablas temporales las VT tienen un alcance local SoloSolo

pueden ser utilizados en el aacutembito donde fueron creadaspueden ser utilizados en el aacutembito donde fueron creadas1048698 1048698 Los cursores basados en VT tienen un alcance localLos cursores basados en VT tienen un alcance local1048698 1048698 Las VT no son objetos persistentes y no se pueden deshacer sus Las VT no son objetos persistentes y no se pueden deshacer sus

cambioscambioscon una sentencia Rollbackcon una sentencia Rollback

Procedimientos de AlmacenadoProcedimientos de Almacenado

Son procedimientos que se encuentran compilados y almacenados en el DBMSPueden realizar operaciones de mantenimiento actualizacioacuteninsercioacuten eliminacioacuten y consultaPueden recibir paracuteametros para realizar sus tareasSon excelentes para mantener seguridad encapsulamiento y para aumentar la eficiencia de las aplicaciones que funcionan coninteraccioacuten con DBMS

Procedimientos de AlmacenadoProcedimientos de Almacenado

Para crear un procedimiento almacenado usamos createalmacenados en el DBMS

create procedure miprocedimiento parametro1 tipo1

asbeginend

Un procedimiento no tiene un valor de retorno pero puede producir resultado en la forma de una o varias consultas

Restricciones de Integridad

Hasta ahora los tipos de restricciones de integridad que hemosvisto usan un modelo estaacutetico dependen de valores constantesSon controladas cada vez que el elemento asociado cambia (en cualquier forma)Hemos usado

bull Restricciones de unicidad ndash llaves primariasbull Restricciones referenciales ndash llaves foracuteaneasbull Restricciones de dominio ndash formatos de strings rangos devalores etc

Las restricciones que hemos visto son impuestas por el disentildeador de la BD y ejecutadas por el DBMS

Sentencias de control de flujoSentencias de control de flujo

1048698 1048698 IfIf

1048698 1048698 WhileWhile

1048698 1048698 BreakBreak

1048698 1048698 ContinueContinue

1048698 1048698 GoToGoTo

1048698 1048698 WaitForWaitFor

Sentencias de control de flujoSentencias de control de flujoIFIF

1048698 1048698 Esta sentencia cambia el flujo de ejecucioacutenEsta sentencia cambia el flujo de ejecucioacuten1048698 1048698 If boolean_expressionIf boolean_expression1048698 1048698 Transact-SQL_statement | statement_block Transact-SQL_statement | statement_block1048698 1048698 [else[else1048698 1048698 Transact-SQL_statement | statement_block] Transact-SQL_statement | statement_block]1048698 1048698 El valor True=Cierto=Verdadero=1El valor True=Cierto=Verdadero=11048698 1048698 El valor False=Falso=0El valor False=Falso=01048698 1048698 Si el valor es cierto ejecuta el primer bloque de Si el valor es cierto ejecuta el primer bloque de

sentencias sino el segundosentencias sino el segundo

EjemploEjemplo WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

Sentencias de control de flujoSentencias de control de flujoIF con subconsultasIF con subconsultas

1048698 1048698 Otra forma de utilizar las consultasOtra forma de utilizar las consultas

1048698 1048698 If [NOT] Exists(subquery)If [NOT] Exists(subquery)

10486981048698 Transact-SQL_statement | Transact-SQL_statement | statement_blockstatement_block

1048698 1048698 [else[else

1048698 1048698 Transact-SQL_statement | Transact-SQL_statement | statement_block]statement_block]

Sentencias de control de flujoSentencias de control de flujoWhileWhile

While Boolean_expressionWhile Boolean_expressionsql_statement | statement_blocksql_statement | statement_block[Break][Break]sql_statement | statement_blocksql_statement | statement_block[Continue][Continue]sql_statement | statement_blocksql_statement | statement_blockResto de instruccionesResto de instrucciones

1048698 1048698 True = 1 False = 0True = 1 False = 01048698 1048698 Break El servidor interrumpe el bucle y salta a la siguienteBreak El servidor interrumpe el bucle y salta a la siguienteinstruccioacuten despueacutes del bucle Resto de instruccionesinstruccioacuten despueacutes del bucle Resto de instrucciones1048698 1048698 Continue El servidor vuelve inmediatamente a la guarda del Continue El servidor vuelve inmediatamente a la guarda del

buclebucleignorando el resto de instrucciones por ejecutar despueacutes de laignorando el resto de instrucciones por ejecutar despueacutes de lasentencia continue Boolean_expressionsentencia continue Boolean_expression

Sentencias de control de flujoSentencias de control de flujoEjemplo de la instruccioacuten WhileEjemplo de la instruccioacuten While

Create Procedure prCalcFactorialCreate Procedure prCalcFactorial-- calculate factorial-- calculate factorial-- 1 = 1-- 1 = 1-- 3 = 3 2 1-- 3 = 3 2 1-- n = n (n-1) 5 4 3 2 1-- n = n (n-1) 5 4 3 2 1

N tinyintN tinyintF int OUTPUTF int OUTPUTAsAsSet F = 1Set F = 1while N gt 1while N gt 1beginbegin

set F = F Nset F = F NSet N = N - 1Set N = N - 1

endendreturn 0return 0

CursoresCursores

conjuntos de datosconjuntos de datos

Las aplicaciones de usuario estan Las aplicaciones de usuario estan desentildeadas para mostrar conjuntosdesentildeadas para mostrar conjuntos

de datos por registrosde datos por registros

Los cursores unen estos dos enfoquesLos cursores unen estos dos enfoques

Tenemos tres tipos de cursores en SQL Tenemos tres tipos de cursores en SQL ServerServer

ndash ndash Client cursorsClient cursors

ndash ndash API Server cursorsAPI Server cursors

ndash ndash Transact-SQL cursorsTransact-SQL cursors

CursoresCursoresTransact-SQL vs Resto de cursoresTransact-SQL vs Resto de cursores

La finalidad de los cursores es su La finalidad de los cursores es su principal diferenciaprincipal diferencia

1048698 1048698 Transact-SQL se utiliza enTransact-SQL se utiliza enndash ndash Los procedimientos almacenadosLos procedimientos almacenadosndash ndash Los procesos por lotesLos procesos por lotesndash ndash Las funcionesLas funcionesndash ndash Los disparadoresLos disparadores1048698 1048698 El resto de cursores se utilizan desde El resto de cursores se utilizan desde

las aplicaciones de loslas aplicaciones de losusuarios (normalmente en forma usuarios (normalmente en forma

embebida)embebida)

CursoresCursoresTransact-SQLTransact-SQL

1048698 1048698 Pasos a seguir en la definicioacuten de un cursor en un Pasos a seguir en la definicioacuten de un cursor en un procedimientoprocedimiento

almacenadoalmacenado1048698 1048698 1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1048698 1048698 2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor1048698 1048698 3 Utilizar la sentencia ldquoFetchrdquo para3 Utilizar la sentencia ldquoFetchrdquo para

ndash ndash recuperar los valores a los que apunta el cursorrecuperar los valores a los que apunta el cursorndash ndash cambiar la posicioacuten del puntero del cursorcambiar la posicioacuten del puntero del cursor

1048698 1048698 4 Ahora utilizamos los valores leidos para nuestros fines4 Ahora utilizamos los valores leidos para nuestros fines1048698 1048698 5 Si es necesario se repiten los pasos 3 y 45 Si es necesario se repiten los pasos 3 y 41048698 1048698 6 Cerramos el cursor para6 Cerramos el cursor para

ndash ndash desbloquear los datosdesbloquear los datosndash ndash liberar memorialiberar memoriandash ndash etcetc1048698 1048698 7 Eliminamos definitivamente el cursor7 Eliminamos definitivamente el cursor

Cursores EjemploCursores EjemploDefinimos los paraacutemetros y las variablesDefinimos los paraacutemetros y las variables

CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))AS AS BEGIN BEGIN

SET NOCOUNT OFF SET NOCOUNT OFF

DECLARE CAMPANA VARCHAR(20)DECLARE CAMPANA VARCHAR(20)DECLARE CODEJEC VARCHAR(10)DECLARE CODEJEC VARCHAR(10)DECLARE INDICE INTEGERDECLARE INDICE INTEGERDECLARE CORTIPOVTA CHAR(10)DECLARE CORTIPOVTA CHAR(10)

DECLARE ventas CURSOR FOR DECLARE ventas CURSOR FOR SELECT camp_tmk cod_agente indice2 cor_tipopersonaSELECT camp_tmk cod_agente indice2 cor_tipopersona FROM MON_VENTASEASIFROM MON_VENTASEASI WHERE fec_coti between FECHAINI and FECFINWHERE fec_coti between FECHAINI and FECFIN

AND cod_estado in (000PNDPRP)AND cod_estado in (000PNDPRP)

OPEN ventasOPEN ventas

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

ENDENDGOGO

Otro EjemploOtro Ejemplo

declare nombre varchar(50)declare direccion varchar(100)declare departamento_cursor cursor for

select nombre direccion from departamentoopen departamento_cursorfetch next from departamento_cursor into nombre direccionwhile fetch_status = 0begin

print(rsquoDepartamento de rsquo + nombre + rsquo Direcciacuteon rsquo + direccion)fetch next from departamento_cursor into nombre direccion

endclose departamento_cursordeallocate departamento_cursor

TriggersTriggers

No son mas que un caso particular deNo son mas que un caso particular deprocedimiento almacenadoprocedimiento almacenado1048698 1048698 No se pueden ejecutar directamenteNo se pueden ejecutar directamente1048698 1048698 Se ejecutan al realizarse alguna de Se ejecutan al realizarse alguna de

estasestasoperacionesoperacionesndash ndash Insercioacuten InsertInsercioacuten Insertndash ndash Modificacioacuten UpdateModificacioacuten Updatendash ndash Borrado DeleteBorrado Delete

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

Tipos de datosTipos de datos

Los tipos de datos definidos por los usuarios Los tipos de datos definidos por los usuarios se definen comose definen como

siguensiguen1048698 1048698 Exec sp_addtype Phone varchar(20) NOT Exec sp_addtype Phone varchar(20) NOT NULLNULL1048698 1048698 Exec sp_addtype typPostalCode Exec sp_addtype typPostalCode varchar(7) NULL -- in Canadavarchar(7) NULL -- in Canada1048698 1048698 Exec sp_addtype Exec sp_addtype

Es el nombre del procedimiento almacenado Es el nombre del procedimiento almacenado que nos permite definir un tipo de datos que nos permite definir un tipo de datos Phone oacute typPostalCode es el nombre del Phone oacute typPostalCode es el nombre del tipo de datos que estamos creando tipo de datos que estamos creando

Variables localesVariables locales

El aacutembito de las VL es el procedimiento El aacutembito de las VL es el procedimiento almacenado donde se declaranalmacenado donde se declaran

1048698 1048698 Se definen asiacuteSe definen asiacutendash Declare LastName varchar(50)Declare LastName varchar(50)ndash Declare LastName varchar(50)Declare LastName varchar(50)FirstName varchar(30)FirstName varchar(30)BirthDate smalldatetimeBirthDate smalldatetime

1048698 1048698 Variables definidas seguacuten tipo de datos Variables definidas seguacuten tipo de datos construido por el usuarioconstruido por el usuariondash Declare OfficePhone phoneDeclare OfficePhone phone

Variables localesVariables locales

La asignacioacuten de valores se realiza con La asignacioacuten de valores se realiza con la sentenciala sentencia

SELECTSELECT

1048698 1048698 Select LastName = SmithSelect LastName = Smith

1048698 1048698 Se pueden realizar varias asignaciones a la Se pueden realizar varias asignaciones a la vezvez

1048698 1048698 Select LastName = Smith Select LastName = Smith

FirstName = DavidFirstName = David

BirthDate = 2211965BirthDate = 2211965

Variables localesVariables locales

1048698 1048698 Declare make varchar(50) model varchar(50) Declare make varchar(50) model varchar(50) EqType varchar(50)EqType varchar(50)1048698 1048698 Select Make = ACME Model = Turbo Select Make = ACME Model = Turbo EqType = cabadasterEqType = cabadaster1048698 1048698 Select Make = make Model = Model Select Make = make Model = Model EqType = EqTypeEqTypeEqType = EqTypeEqType1048698 1048698 From EqType INNER JOIN EquipmentFrom EqType INNER JOIN Equipment1048698 1048698 ON EqTypeEqTypeId = EquipmentEqTypeIdON EqTypeEqTypeId = EquipmentEqTypeId1048698 1048698 Where EquipmentId = -1Where EquipmentId = -11048698 1048698 Select make make model model EqType Select make make model model EqType

EqTypeEqType

Variables localesVariables locales

1048698 1048698 SQL Server permite asignar valores a SQL Server permite asignar valores a las variableslas variables

dentro de una sentencia de dentro de una sentencia de actualizacioacutenactualizacioacuten

10486981048698 Update InventoryUpdate Inventory

Set mnsCost = Cost = Cost fltTaxRateSet mnsCost = Cost = Cost fltTaxRate

Where InventoryId = intInventoryIdWhere InventoryId = intInventoryId

Variables GlobalesVariables Globales

No las definimosNo las definimos1048698 1048698 El servidor las mantiene por nosotrosEl servidor las mantiene por nosotros1048698 1048698 identityidentityndash ndash Almacena el coacutedigo interno de identificacioacuten de un Almacena el coacutedigo interno de identificacioacuten de un

registroregistrondash ndash Almacena el uacuteltimo coacutedigo de la uacuteltima insercioacutenAlmacena el uacuteltimo coacutedigo de la uacuteltima insercioacuten1048698 1048698 errorerrorndash ndash 0 = No existe error0 = No existe errorndash ndash Otro valor = Indica el coacutedigo del errorOtro valor = Indica el coacutedigo del error1048698 1048698 rowcountrowcountndash ndash Nuacutemero de registros afectados en la uacuteltima Nuacutemero de registros afectados en la uacuteltima

sentenciasentencia

Variables de tipo tablaVariables de tipo tabla

Declare MyTableVar table (Id int primary Declare MyTableVar table (Id int primary key Lookupkey Lookup

varchar(15))varchar(15))

1048698 1048698 Insert MyTableVar values (1 1Q2000)Insert MyTableVar values (1 1Q2000)

1048698 1048698 Insert MyTableVar values (2 2Q2000)Insert MyTableVar values (2 2Q2000)

1048698 1048698 Insert MyTableVar values (3 3Q2000)Insert MyTableVar values (3 3Q2000)

1048698 1048698 Select from MyTableVarSelect from MyTableVar

Variables de tipo tablaVariables de tipo tabla

Las VT solo pueden aparecer como parte de las sentencias Select Las VT solo pueden aparecer como parte de las sentencias Select UpdateUpdate

1048698 1048698 Delete Insert y CursoresDelete Insert y Cursores1048698 1048698 No pueden aparecer en sentencias SELECT de insercioacuten SelectIntoNo pueden aparecer en sentencias SELECT de insercioacuten SelectInto

Select LookupId LookupSelect LookupId LookupInto TableVariable -- wrongInto TableVariable -- wrongFrom LookupFrom Lookup

1048698 1048698 No puede aparecer en sentencias de insercioacuten que utilicen No puede aparecer en sentencias de insercioacuten que utilicen procedimientosprocedimientos

alamcenadosalamcenadosInsert into TableVariable -- wrongInsert into TableVariable -- wrongExec prMyProcedureExec prMyProcedure

1048698 1048698 A diferencia de las tablas temporales las VT tienen un alcance local A diferencia de las tablas temporales las VT tienen un alcance local SoloSolo

pueden ser utilizados en el aacutembito donde fueron creadaspueden ser utilizados en el aacutembito donde fueron creadas1048698 1048698 Los cursores basados en VT tienen un alcance localLos cursores basados en VT tienen un alcance local1048698 1048698 Las VT no son objetos persistentes y no se pueden deshacer sus Las VT no son objetos persistentes y no se pueden deshacer sus

cambioscambioscon una sentencia Rollbackcon una sentencia Rollback

Procedimientos de AlmacenadoProcedimientos de Almacenado

Son procedimientos que se encuentran compilados y almacenados en el DBMSPueden realizar operaciones de mantenimiento actualizacioacuteninsercioacuten eliminacioacuten y consultaPueden recibir paracuteametros para realizar sus tareasSon excelentes para mantener seguridad encapsulamiento y para aumentar la eficiencia de las aplicaciones que funcionan coninteraccioacuten con DBMS

Procedimientos de AlmacenadoProcedimientos de Almacenado

Para crear un procedimiento almacenado usamos createalmacenados en el DBMS

create procedure miprocedimiento parametro1 tipo1

asbeginend

Un procedimiento no tiene un valor de retorno pero puede producir resultado en la forma de una o varias consultas

Restricciones de Integridad

Hasta ahora los tipos de restricciones de integridad que hemosvisto usan un modelo estaacutetico dependen de valores constantesSon controladas cada vez que el elemento asociado cambia (en cualquier forma)Hemos usado

bull Restricciones de unicidad ndash llaves primariasbull Restricciones referenciales ndash llaves foracuteaneasbull Restricciones de dominio ndash formatos de strings rangos devalores etc

Las restricciones que hemos visto son impuestas por el disentildeador de la BD y ejecutadas por el DBMS

Sentencias de control de flujoSentencias de control de flujo

1048698 1048698 IfIf

1048698 1048698 WhileWhile

1048698 1048698 BreakBreak

1048698 1048698 ContinueContinue

1048698 1048698 GoToGoTo

1048698 1048698 WaitForWaitFor

Sentencias de control de flujoSentencias de control de flujoIFIF

1048698 1048698 Esta sentencia cambia el flujo de ejecucioacutenEsta sentencia cambia el flujo de ejecucioacuten1048698 1048698 If boolean_expressionIf boolean_expression1048698 1048698 Transact-SQL_statement | statement_block Transact-SQL_statement | statement_block1048698 1048698 [else[else1048698 1048698 Transact-SQL_statement | statement_block] Transact-SQL_statement | statement_block]1048698 1048698 El valor True=Cierto=Verdadero=1El valor True=Cierto=Verdadero=11048698 1048698 El valor False=Falso=0El valor False=Falso=01048698 1048698 Si el valor es cierto ejecuta el primer bloque de Si el valor es cierto ejecuta el primer bloque de

sentencias sino el segundosentencias sino el segundo

EjemploEjemplo WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

Sentencias de control de flujoSentencias de control de flujoIF con subconsultasIF con subconsultas

1048698 1048698 Otra forma de utilizar las consultasOtra forma de utilizar las consultas

1048698 1048698 If [NOT] Exists(subquery)If [NOT] Exists(subquery)

10486981048698 Transact-SQL_statement | Transact-SQL_statement | statement_blockstatement_block

1048698 1048698 [else[else

1048698 1048698 Transact-SQL_statement | Transact-SQL_statement | statement_block]statement_block]

Sentencias de control de flujoSentencias de control de flujoWhileWhile

While Boolean_expressionWhile Boolean_expressionsql_statement | statement_blocksql_statement | statement_block[Break][Break]sql_statement | statement_blocksql_statement | statement_block[Continue][Continue]sql_statement | statement_blocksql_statement | statement_blockResto de instruccionesResto de instrucciones

1048698 1048698 True = 1 False = 0True = 1 False = 01048698 1048698 Break El servidor interrumpe el bucle y salta a la siguienteBreak El servidor interrumpe el bucle y salta a la siguienteinstruccioacuten despueacutes del bucle Resto de instruccionesinstruccioacuten despueacutes del bucle Resto de instrucciones1048698 1048698 Continue El servidor vuelve inmediatamente a la guarda del Continue El servidor vuelve inmediatamente a la guarda del

buclebucleignorando el resto de instrucciones por ejecutar despueacutes de laignorando el resto de instrucciones por ejecutar despueacutes de lasentencia continue Boolean_expressionsentencia continue Boolean_expression

Sentencias de control de flujoSentencias de control de flujoEjemplo de la instruccioacuten WhileEjemplo de la instruccioacuten While

Create Procedure prCalcFactorialCreate Procedure prCalcFactorial-- calculate factorial-- calculate factorial-- 1 = 1-- 1 = 1-- 3 = 3 2 1-- 3 = 3 2 1-- n = n (n-1) 5 4 3 2 1-- n = n (n-1) 5 4 3 2 1

N tinyintN tinyintF int OUTPUTF int OUTPUTAsAsSet F = 1Set F = 1while N gt 1while N gt 1beginbegin

set F = F Nset F = F NSet N = N - 1Set N = N - 1

endendreturn 0return 0

CursoresCursores

conjuntos de datosconjuntos de datos

Las aplicaciones de usuario estan Las aplicaciones de usuario estan desentildeadas para mostrar conjuntosdesentildeadas para mostrar conjuntos

de datos por registrosde datos por registros

Los cursores unen estos dos enfoquesLos cursores unen estos dos enfoques

Tenemos tres tipos de cursores en SQL Tenemos tres tipos de cursores en SQL ServerServer

ndash ndash Client cursorsClient cursors

ndash ndash API Server cursorsAPI Server cursors

ndash ndash Transact-SQL cursorsTransact-SQL cursors

CursoresCursoresTransact-SQL vs Resto de cursoresTransact-SQL vs Resto de cursores

La finalidad de los cursores es su La finalidad de los cursores es su principal diferenciaprincipal diferencia

1048698 1048698 Transact-SQL se utiliza enTransact-SQL se utiliza enndash ndash Los procedimientos almacenadosLos procedimientos almacenadosndash ndash Los procesos por lotesLos procesos por lotesndash ndash Las funcionesLas funcionesndash ndash Los disparadoresLos disparadores1048698 1048698 El resto de cursores se utilizan desde El resto de cursores se utilizan desde

las aplicaciones de loslas aplicaciones de losusuarios (normalmente en forma usuarios (normalmente en forma

embebida)embebida)

CursoresCursoresTransact-SQLTransact-SQL

1048698 1048698 Pasos a seguir en la definicioacuten de un cursor en un Pasos a seguir en la definicioacuten de un cursor en un procedimientoprocedimiento

almacenadoalmacenado1048698 1048698 1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1048698 1048698 2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor1048698 1048698 3 Utilizar la sentencia ldquoFetchrdquo para3 Utilizar la sentencia ldquoFetchrdquo para

ndash ndash recuperar los valores a los que apunta el cursorrecuperar los valores a los que apunta el cursorndash ndash cambiar la posicioacuten del puntero del cursorcambiar la posicioacuten del puntero del cursor

1048698 1048698 4 Ahora utilizamos los valores leidos para nuestros fines4 Ahora utilizamos los valores leidos para nuestros fines1048698 1048698 5 Si es necesario se repiten los pasos 3 y 45 Si es necesario se repiten los pasos 3 y 41048698 1048698 6 Cerramos el cursor para6 Cerramos el cursor para

ndash ndash desbloquear los datosdesbloquear los datosndash ndash liberar memorialiberar memoriandash ndash etcetc1048698 1048698 7 Eliminamos definitivamente el cursor7 Eliminamos definitivamente el cursor

Cursores EjemploCursores EjemploDefinimos los paraacutemetros y las variablesDefinimos los paraacutemetros y las variables

CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))AS AS BEGIN BEGIN

SET NOCOUNT OFF SET NOCOUNT OFF

DECLARE CAMPANA VARCHAR(20)DECLARE CAMPANA VARCHAR(20)DECLARE CODEJEC VARCHAR(10)DECLARE CODEJEC VARCHAR(10)DECLARE INDICE INTEGERDECLARE INDICE INTEGERDECLARE CORTIPOVTA CHAR(10)DECLARE CORTIPOVTA CHAR(10)

DECLARE ventas CURSOR FOR DECLARE ventas CURSOR FOR SELECT camp_tmk cod_agente indice2 cor_tipopersonaSELECT camp_tmk cod_agente indice2 cor_tipopersona FROM MON_VENTASEASIFROM MON_VENTASEASI WHERE fec_coti between FECHAINI and FECFINWHERE fec_coti between FECHAINI and FECFIN

AND cod_estado in (000PNDPRP)AND cod_estado in (000PNDPRP)

OPEN ventasOPEN ventas

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

ENDENDGOGO

Otro EjemploOtro Ejemplo

declare nombre varchar(50)declare direccion varchar(100)declare departamento_cursor cursor for

select nombre direccion from departamentoopen departamento_cursorfetch next from departamento_cursor into nombre direccionwhile fetch_status = 0begin

print(rsquoDepartamento de rsquo + nombre + rsquo Direcciacuteon rsquo + direccion)fetch next from departamento_cursor into nombre direccion

endclose departamento_cursordeallocate departamento_cursor

TriggersTriggers

No son mas que un caso particular deNo son mas que un caso particular deprocedimiento almacenadoprocedimiento almacenado1048698 1048698 No se pueden ejecutar directamenteNo se pueden ejecutar directamente1048698 1048698 Se ejecutan al realizarse alguna de Se ejecutan al realizarse alguna de

estasestasoperacionesoperacionesndash ndash Insercioacuten InsertInsercioacuten Insertndash ndash Modificacioacuten UpdateModificacioacuten Updatendash ndash Borrado DeleteBorrado Delete

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

Variables localesVariables locales

El aacutembito de las VL es el procedimiento El aacutembito de las VL es el procedimiento almacenado donde se declaranalmacenado donde se declaran

1048698 1048698 Se definen asiacuteSe definen asiacutendash Declare LastName varchar(50)Declare LastName varchar(50)ndash Declare LastName varchar(50)Declare LastName varchar(50)FirstName varchar(30)FirstName varchar(30)BirthDate smalldatetimeBirthDate smalldatetime

1048698 1048698 Variables definidas seguacuten tipo de datos Variables definidas seguacuten tipo de datos construido por el usuarioconstruido por el usuariondash Declare OfficePhone phoneDeclare OfficePhone phone

Variables localesVariables locales

La asignacioacuten de valores se realiza con La asignacioacuten de valores se realiza con la sentenciala sentencia

SELECTSELECT

1048698 1048698 Select LastName = SmithSelect LastName = Smith

1048698 1048698 Se pueden realizar varias asignaciones a la Se pueden realizar varias asignaciones a la vezvez

1048698 1048698 Select LastName = Smith Select LastName = Smith

FirstName = DavidFirstName = David

BirthDate = 2211965BirthDate = 2211965

Variables localesVariables locales

1048698 1048698 Declare make varchar(50) model varchar(50) Declare make varchar(50) model varchar(50) EqType varchar(50)EqType varchar(50)1048698 1048698 Select Make = ACME Model = Turbo Select Make = ACME Model = Turbo EqType = cabadasterEqType = cabadaster1048698 1048698 Select Make = make Model = Model Select Make = make Model = Model EqType = EqTypeEqTypeEqType = EqTypeEqType1048698 1048698 From EqType INNER JOIN EquipmentFrom EqType INNER JOIN Equipment1048698 1048698 ON EqTypeEqTypeId = EquipmentEqTypeIdON EqTypeEqTypeId = EquipmentEqTypeId1048698 1048698 Where EquipmentId = -1Where EquipmentId = -11048698 1048698 Select make make model model EqType Select make make model model EqType

EqTypeEqType

Variables localesVariables locales

1048698 1048698 SQL Server permite asignar valores a SQL Server permite asignar valores a las variableslas variables

dentro de una sentencia de dentro de una sentencia de actualizacioacutenactualizacioacuten

10486981048698 Update InventoryUpdate Inventory

Set mnsCost = Cost = Cost fltTaxRateSet mnsCost = Cost = Cost fltTaxRate

Where InventoryId = intInventoryIdWhere InventoryId = intInventoryId

Variables GlobalesVariables Globales

No las definimosNo las definimos1048698 1048698 El servidor las mantiene por nosotrosEl servidor las mantiene por nosotros1048698 1048698 identityidentityndash ndash Almacena el coacutedigo interno de identificacioacuten de un Almacena el coacutedigo interno de identificacioacuten de un

registroregistrondash ndash Almacena el uacuteltimo coacutedigo de la uacuteltima insercioacutenAlmacena el uacuteltimo coacutedigo de la uacuteltima insercioacuten1048698 1048698 errorerrorndash ndash 0 = No existe error0 = No existe errorndash ndash Otro valor = Indica el coacutedigo del errorOtro valor = Indica el coacutedigo del error1048698 1048698 rowcountrowcountndash ndash Nuacutemero de registros afectados en la uacuteltima Nuacutemero de registros afectados en la uacuteltima

sentenciasentencia

Variables de tipo tablaVariables de tipo tabla

Declare MyTableVar table (Id int primary Declare MyTableVar table (Id int primary key Lookupkey Lookup

varchar(15))varchar(15))

1048698 1048698 Insert MyTableVar values (1 1Q2000)Insert MyTableVar values (1 1Q2000)

1048698 1048698 Insert MyTableVar values (2 2Q2000)Insert MyTableVar values (2 2Q2000)

1048698 1048698 Insert MyTableVar values (3 3Q2000)Insert MyTableVar values (3 3Q2000)

1048698 1048698 Select from MyTableVarSelect from MyTableVar

Variables de tipo tablaVariables de tipo tabla

Las VT solo pueden aparecer como parte de las sentencias Select Las VT solo pueden aparecer como parte de las sentencias Select UpdateUpdate

1048698 1048698 Delete Insert y CursoresDelete Insert y Cursores1048698 1048698 No pueden aparecer en sentencias SELECT de insercioacuten SelectIntoNo pueden aparecer en sentencias SELECT de insercioacuten SelectInto

Select LookupId LookupSelect LookupId LookupInto TableVariable -- wrongInto TableVariable -- wrongFrom LookupFrom Lookup

1048698 1048698 No puede aparecer en sentencias de insercioacuten que utilicen No puede aparecer en sentencias de insercioacuten que utilicen procedimientosprocedimientos

alamcenadosalamcenadosInsert into TableVariable -- wrongInsert into TableVariable -- wrongExec prMyProcedureExec prMyProcedure

1048698 1048698 A diferencia de las tablas temporales las VT tienen un alcance local A diferencia de las tablas temporales las VT tienen un alcance local SoloSolo

pueden ser utilizados en el aacutembito donde fueron creadaspueden ser utilizados en el aacutembito donde fueron creadas1048698 1048698 Los cursores basados en VT tienen un alcance localLos cursores basados en VT tienen un alcance local1048698 1048698 Las VT no son objetos persistentes y no se pueden deshacer sus Las VT no son objetos persistentes y no se pueden deshacer sus

cambioscambioscon una sentencia Rollbackcon una sentencia Rollback

Procedimientos de AlmacenadoProcedimientos de Almacenado

Son procedimientos que se encuentran compilados y almacenados en el DBMSPueden realizar operaciones de mantenimiento actualizacioacuteninsercioacuten eliminacioacuten y consultaPueden recibir paracuteametros para realizar sus tareasSon excelentes para mantener seguridad encapsulamiento y para aumentar la eficiencia de las aplicaciones que funcionan coninteraccioacuten con DBMS

Procedimientos de AlmacenadoProcedimientos de Almacenado

Para crear un procedimiento almacenado usamos createalmacenados en el DBMS

create procedure miprocedimiento parametro1 tipo1

asbeginend

Un procedimiento no tiene un valor de retorno pero puede producir resultado en la forma de una o varias consultas

Restricciones de Integridad

Hasta ahora los tipos de restricciones de integridad que hemosvisto usan un modelo estaacutetico dependen de valores constantesSon controladas cada vez que el elemento asociado cambia (en cualquier forma)Hemos usado

bull Restricciones de unicidad ndash llaves primariasbull Restricciones referenciales ndash llaves foracuteaneasbull Restricciones de dominio ndash formatos de strings rangos devalores etc

Las restricciones que hemos visto son impuestas por el disentildeador de la BD y ejecutadas por el DBMS

Sentencias de control de flujoSentencias de control de flujo

1048698 1048698 IfIf

1048698 1048698 WhileWhile

1048698 1048698 BreakBreak

1048698 1048698 ContinueContinue

1048698 1048698 GoToGoTo

1048698 1048698 WaitForWaitFor

Sentencias de control de flujoSentencias de control de flujoIFIF

1048698 1048698 Esta sentencia cambia el flujo de ejecucioacutenEsta sentencia cambia el flujo de ejecucioacuten1048698 1048698 If boolean_expressionIf boolean_expression1048698 1048698 Transact-SQL_statement | statement_block Transact-SQL_statement | statement_block1048698 1048698 [else[else1048698 1048698 Transact-SQL_statement | statement_block] Transact-SQL_statement | statement_block]1048698 1048698 El valor True=Cierto=Verdadero=1El valor True=Cierto=Verdadero=11048698 1048698 El valor False=Falso=0El valor False=Falso=01048698 1048698 Si el valor es cierto ejecuta el primer bloque de Si el valor es cierto ejecuta el primer bloque de

sentencias sino el segundosentencias sino el segundo

EjemploEjemplo WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

Sentencias de control de flujoSentencias de control de flujoIF con subconsultasIF con subconsultas

1048698 1048698 Otra forma de utilizar las consultasOtra forma de utilizar las consultas

1048698 1048698 If [NOT] Exists(subquery)If [NOT] Exists(subquery)

10486981048698 Transact-SQL_statement | Transact-SQL_statement | statement_blockstatement_block

1048698 1048698 [else[else

1048698 1048698 Transact-SQL_statement | Transact-SQL_statement | statement_block]statement_block]

Sentencias de control de flujoSentencias de control de flujoWhileWhile

While Boolean_expressionWhile Boolean_expressionsql_statement | statement_blocksql_statement | statement_block[Break][Break]sql_statement | statement_blocksql_statement | statement_block[Continue][Continue]sql_statement | statement_blocksql_statement | statement_blockResto de instruccionesResto de instrucciones

1048698 1048698 True = 1 False = 0True = 1 False = 01048698 1048698 Break El servidor interrumpe el bucle y salta a la siguienteBreak El servidor interrumpe el bucle y salta a la siguienteinstruccioacuten despueacutes del bucle Resto de instruccionesinstruccioacuten despueacutes del bucle Resto de instrucciones1048698 1048698 Continue El servidor vuelve inmediatamente a la guarda del Continue El servidor vuelve inmediatamente a la guarda del

buclebucleignorando el resto de instrucciones por ejecutar despueacutes de laignorando el resto de instrucciones por ejecutar despueacutes de lasentencia continue Boolean_expressionsentencia continue Boolean_expression

Sentencias de control de flujoSentencias de control de flujoEjemplo de la instruccioacuten WhileEjemplo de la instruccioacuten While

Create Procedure prCalcFactorialCreate Procedure prCalcFactorial-- calculate factorial-- calculate factorial-- 1 = 1-- 1 = 1-- 3 = 3 2 1-- 3 = 3 2 1-- n = n (n-1) 5 4 3 2 1-- n = n (n-1) 5 4 3 2 1

N tinyintN tinyintF int OUTPUTF int OUTPUTAsAsSet F = 1Set F = 1while N gt 1while N gt 1beginbegin

set F = F Nset F = F NSet N = N - 1Set N = N - 1

endendreturn 0return 0

CursoresCursores

conjuntos de datosconjuntos de datos

Las aplicaciones de usuario estan Las aplicaciones de usuario estan desentildeadas para mostrar conjuntosdesentildeadas para mostrar conjuntos

de datos por registrosde datos por registros

Los cursores unen estos dos enfoquesLos cursores unen estos dos enfoques

Tenemos tres tipos de cursores en SQL Tenemos tres tipos de cursores en SQL ServerServer

ndash ndash Client cursorsClient cursors

ndash ndash API Server cursorsAPI Server cursors

ndash ndash Transact-SQL cursorsTransact-SQL cursors

CursoresCursoresTransact-SQL vs Resto de cursoresTransact-SQL vs Resto de cursores

La finalidad de los cursores es su La finalidad de los cursores es su principal diferenciaprincipal diferencia

1048698 1048698 Transact-SQL se utiliza enTransact-SQL se utiliza enndash ndash Los procedimientos almacenadosLos procedimientos almacenadosndash ndash Los procesos por lotesLos procesos por lotesndash ndash Las funcionesLas funcionesndash ndash Los disparadoresLos disparadores1048698 1048698 El resto de cursores se utilizan desde El resto de cursores se utilizan desde

las aplicaciones de loslas aplicaciones de losusuarios (normalmente en forma usuarios (normalmente en forma

embebida)embebida)

CursoresCursoresTransact-SQLTransact-SQL

1048698 1048698 Pasos a seguir en la definicioacuten de un cursor en un Pasos a seguir en la definicioacuten de un cursor en un procedimientoprocedimiento

almacenadoalmacenado1048698 1048698 1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1048698 1048698 2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor1048698 1048698 3 Utilizar la sentencia ldquoFetchrdquo para3 Utilizar la sentencia ldquoFetchrdquo para

ndash ndash recuperar los valores a los que apunta el cursorrecuperar los valores a los que apunta el cursorndash ndash cambiar la posicioacuten del puntero del cursorcambiar la posicioacuten del puntero del cursor

1048698 1048698 4 Ahora utilizamos los valores leidos para nuestros fines4 Ahora utilizamos los valores leidos para nuestros fines1048698 1048698 5 Si es necesario se repiten los pasos 3 y 45 Si es necesario se repiten los pasos 3 y 41048698 1048698 6 Cerramos el cursor para6 Cerramos el cursor para

ndash ndash desbloquear los datosdesbloquear los datosndash ndash liberar memorialiberar memoriandash ndash etcetc1048698 1048698 7 Eliminamos definitivamente el cursor7 Eliminamos definitivamente el cursor

Cursores EjemploCursores EjemploDefinimos los paraacutemetros y las variablesDefinimos los paraacutemetros y las variables

CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))AS AS BEGIN BEGIN

SET NOCOUNT OFF SET NOCOUNT OFF

DECLARE CAMPANA VARCHAR(20)DECLARE CAMPANA VARCHAR(20)DECLARE CODEJEC VARCHAR(10)DECLARE CODEJEC VARCHAR(10)DECLARE INDICE INTEGERDECLARE INDICE INTEGERDECLARE CORTIPOVTA CHAR(10)DECLARE CORTIPOVTA CHAR(10)

DECLARE ventas CURSOR FOR DECLARE ventas CURSOR FOR SELECT camp_tmk cod_agente indice2 cor_tipopersonaSELECT camp_tmk cod_agente indice2 cor_tipopersona FROM MON_VENTASEASIFROM MON_VENTASEASI WHERE fec_coti between FECHAINI and FECFINWHERE fec_coti between FECHAINI and FECFIN

AND cod_estado in (000PNDPRP)AND cod_estado in (000PNDPRP)

OPEN ventasOPEN ventas

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

ENDENDGOGO

Otro EjemploOtro Ejemplo

declare nombre varchar(50)declare direccion varchar(100)declare departamento_cursor cursor for

select nombre direccion from departamentoopen departamento_cursorfetch next from departamento_cursor into nombre direccionwhile fetch_status = 0begin

print(rsquoDepartamento de rsquo + nombre + rsquo Direcciacuteon rsquo + direccion)fetch next from departamento_cursor into nombre direccion

endclose departamento_cursordeallocate departamento_cursor

TriggersTriggers

No son mas que un caso particular deNo son mas que un caso particular deprocedimiento almacenadoprocedimiento almacenado1048698 1048698 No se pueden ejecutar directamenteNo se pueden ejecutar directamente1048698 1048698 Se ejecutan al realizarse alguna de Se ejecutan al realizarse alguna de

estasestasoperacionesoperacionesndash ndash Insercioacuten InsertInsercioacuten Insertndash ndash Modificacioacuten UpdateModificacioacuten Updatendash ndash Borrado DeleteBorrado Delete

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

Variables localesVariables locales

La asignacioacuten de valores se realiza con La asignacioacuten de valores se realiza con la sentenciala sentencia

SELECTSELECT

1048698 1048698 Select LastName = SmithSelect LastName = Smith

1048698 1048698 Se pueden realizar varias asignaciones a la Se pueden realizar varias asignaciones a la vezvez

1048698 1048698 Select LastName = Smith Select LastName = Smith

FirstName = DavidFirstName = David

BirthDate = 2211965BirthDate = 2211965

Variables localesVariables locales

1048698 1048698 Declare make varchar(50) model varchar(50) Declare make varchar(50) model varchar(50) EqType varchar(50)EqType varchar(50)1048698 1048698 Select Make = ACME Model = Turbo Select Make = ACME Model = Turbo EqType = cabadasterEqType = cabadaster1048698 1048698 Select Make = make Model = Model Select Make = make Model = Model EqType = EqTypeEqTypeEqType = EqTypeEqType1048698 1048698 From EqType INNER JOIN EquipmentFrom EqType INNER JOIN Equipment1048698 1048698 ON EqTypeEqTypeId = EquipmentEqTypeIdON EqTypeEqTypeId = EquipmentEqTypeId1048698 1048698 Where EquipmentId = -1Where EquipmentId = -11048698 1048698 Select make make model model EqType Select make make model model EqType

EqTypeEqType

Variables localesVariables locales

1048698 1048698 SQL Server permite asignar valores a SQL Server permite asignar valores a las variableslas variables

dentro de una sentencia de dentro de una sentencia de actualizacioacutenactualizacioacuten

10486981048698 Update InventoryUpdate Inventory

Set mnsCost = Cost = Cost fltTaxRateSet mnsCost = Cost = Cost fltTaxRate

Where InventoryId = intInventoryIdWhere InventoryId = intInventoryId

Variables GlobalesVariables Globales

No las definimosNo las definimos1048698 1048698 El servidor las mantiene por nosotrosEl servidor las mantiene por nosotros1048698 1048698 identityidentityndash ndash Almacena el coacutedigo interno de identificacioacuten de un Almacena el coacutedigo interno de identificacioacuten de un

registroregistrondash ndash Almacena el uacuteltimo coacutedigo de la uacuteltima insercioacutenAlmacena el uacuteltimo coacutedigo de la uacuteltima insercioacuten1048698 1048698 errorerrorndash ndash 0 = No existe error0 = No existe errorndash ndash Otro valor = Indica el coacutedigo del errorOtro valor = Indica el coacutedigo del error1048698 1048698 rowcountrowcountndash ndash Nuacutemero de registros afectados en la uacuteltima Nuacutemero de registros afectados en la uacuteltima

sentenciasentencia

Variables de tipo tablaVariables de tipo tabla

Declare MyTableVar table (Id int primary Declare MyTableVar table (Id int primary key Lookupkey Lookup

varchar(15))varchar(15))

1048698 1048698 Insert MyTableVar values (1 1Q2000)Insert MyTableVar values (1 1Q2000)

1048698 1048698 Insert MyTableVar values (2 2Q2000)Insert MyTableVar values (2 2Q2000)

1048698 1048698 Insert MyTableVar values (3 3Q2000)Insert MyTableVar values (3 3Q2000)

1048698 1048698 Select from MyTableVarSelect from MyTableVar

Variables de tipo tablaVariables de tipo tabla

Las VT solo pueden aparecer como parte de las sentencias Select Las VT solo pueden aparecer como parte de las sentencias Select UpdateUpdate

1048698 1048698 Delete Insert y CursoresDelete Insert y Cursores1048698 1048698 No pueden aparecer en sentencias SELECT de insercioacuten SelectIntoNo pueden aparecer en sentencias SELECT de insercioacuten SelectInto

Select LookupId LookupSelect LookupId LookupInto TableVariable -- wrongInto TableVariable -- wrongFrom LookupFrom Lookup

1048698 1048698 No puede aparecer en sentencias de insercioacuten que utilicen No puede aparecer en sentencias de insercioacuten que utilicen procedimientosprocedimientos

alamcenadosalamcenadosInsert into TableVariable -- wrongInsert into TableVariable -- wrongExec prMyProcedureExec prMyProcedure

1048698 1048698 A diferencia de las tablas temporales las VT tienen un alcance local A diferencia de las tablas temporales las VT tienen un alcance local SoloSolo

pueden ser utilizados en el aacutembito donde fueron creadaspueden ser utilizados en el aacutembito donde fueron creadas1048698 1048698 Los cursores basados en VT tienen un alcance localLos cursores basados en VT tienen un alcance local1048698 1048698 Las VT no son objetos persistentes y no se pueden deshacer sus Las VT no son objetos persistentes y no se pueden deshacer sus

cambioscambioscon una sentencia Rollbackcon una sentencia Rollback

Procedimientos de AlmacenadoProcedimientos de Almacenado

Son procedimientos que se encuentran compilados y almacenados en el DBMSPueden realizar operaciones de mantenimiento actualizacioacuteninsercioacuten eliminacioacuten y consultaPueden recibir paracuteametros para realizar sus tareasSon excelentes para mantener seguridad encapsulamiento y para aumentar la eficiencia de las aplicaciones que funcionan coninteraccioacuten con DBMS

Procedimientos de AlmacenadoProcedimientos de Almacenado

Para crear un procedimiento almacenado usamos createalmacenados en el DBMS

create procedure miprocedimiento parametro1 tipo1

asbeginend

Un procedimiento no tiene un valor de retorno pero puede producir resultado en la forma de una o varias consultas

Restricciones de Integridad

Hasta ahora los tipos de restricciones de integridad que hemosvisto usan un modelo estaacutetico dependen de valores constantesSon controladas cada vez que el elemento asociado cambia (en cualquier forma)Hemos usado

bull Restricciones de unicidad ndash llaves primariasbull Restricciones referenciales ndash llaves foracuteaneasbull Restricciones de dominio ndash formatos de strings rangos devalores etc

Las restricciones que hemos visto son impuestas por el disentildeador de la BD y ejecutadas por el DBMS

Sentencias de control de flujoSentencias de control de flujo

1048698 1048698 IfIf

1048698 1048698 WhileWhile

1048698 1048698 BreakBreak

1048698 1048698 ContinueContinue

1048698 1048698 GoToGoTo

1048698 1048698 WaitForWaitFor

Sentencias de control de flujoSentencias de control de flujoIFIF

1048698 1048698 Esta sentencia cambia el flujo de ejecucioacutenEsta sentencia cambia el flujo de ejecucioacuten1048698 1048698 If boolean_expressionIf boolean_expression1048698 1048698 Transact-SQL_statement | statement_block Transact-SQL_statement | statement_block1048698 1048698 [else[else1048698 1048698 Transact-SQL_statement | statement_block] Transact-SQL_statement | statement_block]1048698 1048698 El valor True=Cierto=Verdadero=1El valor True=Cierto=Verdadero=11048698 1048698 El valor False=Falso=0El valor False=Falso=01048698 1048698 Si el valor es cierto ejecuta el primer bloque de Si el valor es cierto ejecuta el primer bloque de

sentencias sino el segundosentencias sino el segundo

EjemploEjemplo WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

Sentencias de control de flujoSentencias de control de flujoIF con subconsultasIF con subconsultas

1048698 1048698 Otra forma de utilizar las consultasOtra forma de utilizar las consultas

1048698 1048698 If [NOT] Exists(subquery)If [NOT] Exists(subquery)

10486981048698 Transact-SQL_statement | Transact-SQL_statement | statement_blockstatement_block

1048698 1048698 [else[else

1048698 1048698 Transact-SQL_statement | Transact-SQL_statement | statement_block]statement_block]

Sentencias de control de flujoSentencias de control de flujoWhileWhile

While Boolean_expressionWhile Boolean_expressionsql_statement | statement_blocksql_statement | statement_block[Break][Break]sql_statement | statement_blocksql_statement | statement_block[Continue][Continue]sql_statement | statement_blocksql_statement | statement_blockResto de instruccionesResto de instrucciones

1048698 1048698 True = 1 False = 0True = 1 False = 01048698 1048698 Break El servidor interrumpe el bucle y salta a la siguienteBreak El servidor interrumpe el bucle y salta a la siguienteinstruccioacuten despueacutes del bucle Resto de instruccionesinstruccioacuten despueacutes del bucle Resto de instrucciones1048698 1048698 Continue El servidor vuelve inmediatamente a la guarda del Continue El servidor vuelve inmediatamente a la guarda del

buclebucleignorando el resto de instrucciones por ejecutar despueacutes de laignorando el resto de instrucciones por ejecutar despueacutes de lasentencia continue Boolean_expressionsentencia continue Boolean_expression

Sentencias de control de flujoSentencias de control de flujoEjemplo de la instruccioacuten WhileEjemplo de la instruccioacuten While

Create Procedure prCalcFactorialCreate Procedure prCalcFactorial-- calculate factorial-- calculate factorial-- 1 = 1-- 1 = 1-- 3 = 3 2 1-- 3 = 3 2 1-- n = n (n-1) 5 4 3 2 1-- n = n (n-1) 5 4 3 2 1

N tinyintN tinyintF int OUTPUTF int OUTPUTAsAsSet F = 1Set F = 1while N gt 1while N gt 1beginbegin

set F = F Nset F = F NSet N = N - 1Set N = N - 1

endendreturn 0return 0

CursoresCursores

conjuntos de datosconjuntos de datos

Las aplicaciones de usuario estan Las aplicaciones de usuario estan desentildeadas para mostrar conjuntosdesentildeadas para mostrar conjuntos

de datos por registrosde datos por registros

Los cursores unen estos dos enfoquesLos cursores unen estos dos enfoques

Tenemos tres tipos de cursores en SQL Tenemos tres tipos de cursores en SQL ServerServer

ndash ndash Client cursorsClient cursors

ndash ndash API Server cursorsAPI Server cursors

ndash ndash Transact-SQL cursorsTransact-SQL cursors

CursoresCursoresTransact-SQL vs Resto de cursoresTransact-SQL vs Resto de cursores

La finalidad de los cursores es su La finalidad de los cursores es su principal diferenciaprincipal diferencia

1048698 1048698 Transact-SQL se utiliza enTransact-SQL se utiliza enndash ndash Los procedimientos almacenadosLos procedimientos almacenadosndash ndash Los procesos por lotesLos procesos por lotesndash ndash Las funcionesLas funcionesndash ndash Los disparadoresLos disparadores1048698 1048698 El resto de cursores se utilizan desde El resto de cursores se utilizan desde

las aplicaciones de loslas aplicaciones de losusuarios (normalmente en forma usuarios (normalmente en forma

embebida)embebida)

CursoresCursoresTransact-SQLTransact-SQL

1048698 1048698 Pasos a seguir en la definicioacuten de un cursor en un Pasos a seguir en la definicioacuten de un cursor en un procedimientoprocedimiento

almacenadoalmacenado1048698 1048698 1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1048698 1048698 2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor1048698 1048698 3 Utilizar la sentencia ldquoFetchrdquo para3 Utilizar la sentencia ldquoFetchrdquo para

ndash ndash recuperar los valores a los que apunta el cursorrecuperar los valores a los que apunta el cursorndash ndash cambiar la posicioacuten del puntero del cursorcambiar la posicioacuten del puntero del cursor

1048698 1048698 4 Ahora utilizamos los valores leidos para nuestros fines4 Ahora utilizamos los valores leidos para nuestros fines1048698 1048698 5 Si es necesario se repiten los pasos 3 y 45 Si es necesario se repiten los pasos 3 y 41048698 1048698 6 Cerramos el cursor para6 Cerramos el cursor para

ndash ndash desbloquear los datosdesbloquear los datosndash ndash liberar memorialiberar memoriandash ndash etcetc1048698 1048698 7 Eliminamos definitivamente el cursor7 Eliminamos definitivamente el cursor

Cursores EjemploCursores EjemploDefinimos los paraacutemetros y las variablesDefinimos los paraacutemetros y las variables

CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))AS AS BEGIN BEGIN

SET NOCOUNT OFF SET NOCOUNT OFF

DECLARE CAMPANA VARCHAR(20)DECLARE CAMPANA VARCHAR(20)DECLARE CODEJEC VARCHAR(10)DECLARE CODEJEC VARCHAR(10)DECLARE INDICE INTEGERDECLARE INDICE INTEGERDECLARE CORTIPOVTA CHAR(10)DECLARE CORTIPOVTA CHAR(10)

DECLARE ventas CURSOR FOR DECLARE ventas CURSOR FOR SELECT camp_tmk cod_agente indice2 cor_tipopersonaSELECT camp_tmk cod_agente indice2 cor_tipopersona FROM MON_VENTASEASIFROM MON_VENTASEASI WHERE fec_coti between FECHAINI and FECFINWHERE fec_coti between FECHAINI and FECFIN

AND cod_estado in (000PNDPRP)AND cod_estado in (000PNDPRP)

OPEN ventasOPEN ventas

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

ENDENDGOGO

Otro EjemploOtro Ejemplo

declare nombre varchar(50)declare direccion varchar(100)declare departamento_cursor cursor for

select nombre direccion from departamentoopen departamento_cursorfetch next from departamento_cursor into nombre direccionwhile fetch_status = 0begin

print(rsquoDepartamento de rsquo + nombre + rsquo Direcciacuteon rsquo + direccion)fetch next from departamento_cursor into nombre direccion

endclose departamento_cursordeallocate departamento_cursor

TriggersTriggers

No son mas que un caso particular deNo son mas que un caso particular deprocedimiento almacenadoprocedimiento almacenado1048698 1048698 No se pueden ejecutar directamenteNo se pueden ejecutar directamente1048698 1048698 Se ejecutan al realizarse alguna de Se ejecutan al realizarse alguna de

estasestasoperacionesoperacionesndash ndash Insercioacuten InsertInsercioacuten Insertndash ndash Modificacioacuten UpdateModificacioacuten Updatendash ndash Borrado DeleteBorrado Delete

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

Variables localesVariables locales

1048698 1048698 Declare make varchar(50) model varchar(50) Declare make varchar(50) model varchar(50) EqType varchar(50)EqType varchar(50)1048698 1048698 Select Make = ACME Model = Turbo Select Make = ACME Model = Turbo EqType = cabadasterEqType = cabadaster1048698 1048698 Select Make = make Model = Model Select Make = make Model = Model EqType = EqTypeEqTypeEqType = EqTypeEqType1048698 1048698 From EqType INNER JOIN EquipmentFrom EqType INNER JOIN Equipment1048698 1048698 ON EqTypeEqTypeId = EquipmentEqTypeIdON EqTypeEqTypeId = EquipmentEqTypeId1048698 1048698 Where EquipmentId = -1Where EquipmentId = -11048698 1048698 Select make make model model EqType Select make make model model EqType

EqTypeEqType

Variables localesVariables locales

1048698 1048698 SQL Server permite asignar valores a SQL Server permite asignar valores a las variableslas variables

dentro de una sentencia de dentro de una sentencia de actualizacioacutenactualizacioacuten

10486981048698 Update InventoryUpdate Inventory

Set mnsCost = Cost = Cost fltTaxRateSet mnsCost = Cost = Cost fltTaxRate

Where InventoryId = intInventoryIdWhere InventoryId = intInventoryId

Variables GlobalesVariables Globales

No las definimosNo las definimos1048698 1048698 El servidor las mantiene por nosotrosEl servidor las mantiene por nosotros1048698 1048698 identityidentityndash ndash Almacena el coacutedigo interno de identificacioacuten de un Almacena el coacutedigo interno de identificacioacuten de un

registroregistrondash ndash Almacena el uacuteltimo coacutedigo de la uacuteltima insercioacutenAlmacena el uacuteltimo coacutedigo de la uacuteltima insercioacuten1048698 1048698 errorerrorndash ndash 0 = No existe error0 = No existe errorndash ndash Otro valor = Indica el coacutedigo del errorOtro valor = Indica el coacutedigo del error1048698 1048698 rowcountrowcountndash ndash Nuacutemero de registros afectados en la uacuteltima Nuacutemero de registros afectados en la uacuteltima

sentenciasentencia

Variables de tipo tablaVariables de tipo tabla

Declare MyTableVar table (Id int primary Declare MyTableVar table (Id int primary key Lookupkey Lookup

varchar(15))varchar(15))

1048698 1048698 Insert MyTableVar values (1 1Q2000)Insert MyTableVar values (1 1Q2000)

1048698 1048698 Insert MyTableVar values (2 2Q2000)Insert MyTableVar values (2 2Q2000)

1048698 1048698 Insert MyTableVar values (3 3Q2000)Insert MyTableVar values (3 3Q2000)

1048698 1048698 Select from MyTableVarSelect from MyTableVar

Variables de tipo tablaVariables de tipo tabla

Las VT solo pueden aparecer como parte de las sentencias Select Las VT solo pueden aparecer como parte de las sentencias Select UpdateUpdate

1048698 1048698 Delete Insert y CursoresDelete Insert y Cursores1048698 1048698 No pueden aparecer en sentencias SELECT de insercioacuten SelectIntoNo pueden aparecer en sentencias SELECT de insercioacuten SelectInto

Select LookupId LookupSelect LookupId LookupInto TableVariable -- wrongInto TableVariable -- wrongFrom LookupFrom Lookup

1048698 1048698 No puede aparecer en sentencias de insercioacuten que utilicen No puede aparecer en sentencias de insercioacuten que utilicen procedimientosprocedimientos

alamcenadosalamcenadosInsert into TableVariable -- wrongInsert into TableVariable -- wrongExec prMyProcedureExec prMyProcedure

1048698 1048698 A diferencia de las tablas temporales las VT tienen un alcance local A diferencia de las tablas temporales las VT tienen un alcance local SoloSolo

pueden ser utilizados en el aacutembito donde fueron creadaspueden ser utilizados en el aacutembito donde fueron creadas1048698 1048698 Los cursores basados en VT tienen un alcance localLos cursores basados en VT tienen un alcance local1048698 1048698 Las VT no son objetos persistentes y no se pueden deshacer sus Las VT no son objetos persistentes y no se pueden deshacer sus

cambioscambioscon una sentencia Rollbackcon una sentencia Rollback

Procedimientos de AlmacenadoProcedimientos de Almacenado

Son procedimientos que se encuentran compilados y almacenados en el DBMSPueden realizar operaciones de mantenimiento actualizacioacuteninsercioacuten eliminacioacuten y consultaPueden recibir paracuteametros para realizar sus tareasSon excelentes para mantener seguridad encapsulamiento y para aumentar la eficiencia de las aplicaciones que funcionan coninteraccioacuten con DBMS

Procedimientos de AlmacenadoProcedimientos de Almacenado

Para crear un procedimiento almacenado usamos createalmacenados en el DBMS

create procedure miprocedimiento parametro1 tipo1

asbeginend

Un procedimiento no tiene un valor de retorno pero puede producir resultado en la forma de una o varias consultas

Restricciones de Integridad

Hasta ahora los tipos de restricciones de integridad que hemosvisto usan un modelo estaacutetico dependen de valores constantesSon controladas cada vez que el elemento asociado cambia (en cualquier forma)Hemos usado

bull Restricciones de unicidad ndash llaves primariasbull Restricciones referenciales ndash llaves foracuteaneasbull Restricciones de dominio ndash formatos de strings rangos devalores etc

Las restricciones que hemos visto son impuestas por el disentildeador de la BD y ejecutadas por el DBMS

Sentencias de control de flujoSentencias de control de flujo

1048698 1048698 IfIf

1048698 1048698 WhileWhile

1048698 1048698 BreakBreak

1048698 1048698 ContinueContinue

1048698 1048698 GoToGoTo

1048698 1048698 WaitForWaitFor

Sentencias de control de flujoSentencias de control de flujoIFIF

1048698 1048698 Esta sentencia cambia el flujo de ejecucioacutenEsta sentencia cambia el flujo de ejecucioacuten1048698 1048698 If boolean_expressionIf boolean_expression1048698 1048698 Transact-SQL_statement | statement_block Transact-SQL_statement | statement_block1048698 1048698 [else[else1048698 1048698 Transact-SQL_statement | statement_block] Transact-SQL_statement | statement_block]1048698 1048698 El valor True=Cierto=Verdadero=1El valor True=Cierto=Verdadero=11048698 1048698 El valor False=Falso=0El valor False=Falso=01048698 1048698 Si el valor es cierto ejecuta el primer bloque de Si el valor es cierto ejecuta el primer bloque de

sentencias sino el segundosentencias sino el segundo

EjemploEjemplo WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

Sentencias de control de flujoSentencias de control de flujoIF con subconsultasIF con subconsultas

1048698 1048698 Otra forma de utilizar las consultasOtra forma de utilizar las consultas

1048698 1048698 If [NOT] Exists(subquery)If [NOT] Exists(subquery)

10486981048698 Transact-SQL_statement | Transact-SQL_statement | statement_blockstatement_block

1048698 1048698 [else[else

1048698 1048698 Transact-SQL_statement | Transact-SQL_statement | statement_block]statement_block]

Sentencias de control de flujoSentencias de control de flujoWhileWhile

While Boolean_expressionWhile Boolean_expressionsql_statement | statement_blocksql_statement | statement_block[Break][Break]sql_statement | statement_blocksql_statement | statement_block[Continue][Continue]sql_statement | statement_blocksql_statement | statement_blockResto de instruccionesResto de instrucciones

1048698 1048698 True = 1 False = 0True = 1 False = 01048698 1048698 Break El servidor interrumpe el bucle y salta a la siguienteBreak El servidor interrumpe el bucle y salta a la siguienteinstruccioacuten despueacutes del bucle Resto de instruccionesinstruccioacuten despueacutes del bucle Resto de instrucciones1048698 1048698 Continue El servidor vuelve inmediatamente a la guarda del Continue El servidor vuelve inmediatamente a la guarda del

buclebucleignorando el resto de instrucciones por ejecutar despueacutes de laignorando el resto de instrucciones por ejecutar despueacutes de lasentencia continue Boolean_expressionsentencia continue Boolean_expression

Sentencias de control de flujoSentencias de control de flujoEjemplo de la instruccioacuten WhileEjemplo de la instruccioacuten While

Create Procedure prCalcFactorialCreate Procedure prCalcFactorial-- calculate factorial-- calculate factorial-- 1 = 1-- 1 = 1-- 3 = 3 2 1-- 3 = 3 2 1-- n = n (n-1) 5 4 3 2 1-- n = n (n-1) 5 4 3 2 1

N tinyintN tinyintF int OUTPUTF int OUTPUTAsAsSet F = 1Set F = 1while N gt 1while N gt 1beginbegin

set F = F Nset F = F NSet N = N - 1Set N = N - 1

endendreturn 0return 0

CursoresCursores

conjuntos de datosconjuntos de datos

Las aplicaciones de usuario estan Las aplicaciones de usuario estan desentildeadas para mostrar conjuntosdesentildeadas para mostrar conjuntos

de datos por registrosde datos por registros

Los cursores unen estos dos enfoquesLos cursores unen estos dos enfoques

Tenemos tres tipos de cursores en SQL Tenemos tres tipos de cursores en SQL ServerServer

ndash ndash Client cursorsClient cursors

ndash ndash API Server cursorsAPI Server cursors

ndash ndash Transact-SQL cursorsTransact-SQL cursors

CursoresCursoresTransact-SQL vs Resto de cursoresTransact-SQL vs Resto de cursores

La finalidad de los cursores es su La finalidad de los cursores es su principal diferenciaprincipal diferencia

1048698 1048698 Transact-SQL se utiliza enTransact-SQL se utiliza enndash ndash Los procedimientos almacenadosLos procedimientos almacenadosndash ndash Los procesos por lotesLos procesos por lotesndash ndash Las funcionesLas funcionesndash ndash Los disparadoresLos disparadores1048698 1048698 El resto de cursores se utilizan desde El resto de cursores se utilizan desde

las aplicaciones de loslas aplicaciones de losusuarios (normalmente en forma usuarios (normalmente en forma

embebida)embebida)

CursoresCursoresTransact-SQLTransact-SQL

1048698 1048698 Pasos a seguir en la definicioacuten de un cursor en un Pasos a seguir en la definicioacuten de un cursor en un procedimientoprocedimiento

almacenadoalmacenado1048698 1048698 1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1048698 1048698 2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor1048698 1048698 3 Utilizar la sentencia ldquoFetchrdquo para3 Utilizar la sentencia ldquoFetchrdquo para

ndash ndash recuperar los valores a los que apunta el cursorrecuperar los valores a los que apunta el cursorndash ndash cambiar la posicioacuten del puntero del cursorcambiar la posicioacuten del puntero del cursor

1048698 1048698 4 Ahora utilizamos los valores leidos para nuestros fines4 Ahora utilizamos los valores leidos para nuestros fines1048698 1048698 5 Si es necesario se repiten los pasos 3 y 45 Si es necesario se repiten los pasos 3 y 41048698 1048698 6 Cerramos el cursor para6 Cerramos el cursor para

ndash ndash desbloquear los datosdesbloquear los datosndash ndash liberar memorialiberar memoriandash ndash etcetc1048698 1048698 7 Eliminamos definitivamente el cursor7 Eliminamos definitivamente el cursor

Cursores EjemploCursores EjemploDefinimos los paraacutemetros y las variablesDefinimos los paraacutemetros y las variables

CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))AS AS BEGIN BEGIN

SET NOCOUNT OFF SET NOCOUNT OFF

DECLARE CAMPANA VARCHAR(20)DECLARE CAMPANA VARCHAR(20)DECLARE CODEJEC VARCHAR(10)DECLARE CODEJEC VARCHAR(10)DECLARE INDICE INTEGERDECLARE INDICE INTEGERDECLARE CORTIPOVTA CHAR(10)DECLARE CORTIPOVTA CHAR(10)

DECLARE ventas CURSOR FOR DECLARE ventas CURSOR FOR SELECT camp_tmk cod_agente indice2 cor_tipopersonaSELECT camp_tmk cod_agente indice2 cor_tipopersona FROM MON_VENTASEASIFROM MON_VENTASEASI WHERE fec_coti between FECHAINI and FECFINWHERE fec_coti between FECHAINI and FECFIN

AND cod_estado in (000PNDPRP)AND cod_estado in (000PNDPRP)

OPEN ventasOPEN ventas

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

ENDENDGOGO

Otro EjemploOtro Ejemplo

declare nombre varchar(50)declare direccion varchar(100)declare departamento_cursor cursor for

select nombre direccion from departamentoopen departamento_cursorfetch next from departamento_cursor into nombre direccionwhile fetch_status = 0begin

print(rsquoDepartamento de rsquo + nombre + rsquo Direcciacuteon rsquo + direccion)fetch next from departamento_cursor into nombre direccion

endclose departamento_cursordeallocate departamento_cursor

TriggersTriggers

No son mas que un caso particular deNo son mas que un caso particular deprocedimiento almacenadoprocedimiento almacenado1048698 1048698 No se pueden ejecutar directamenteNo se pueden ejecutar directamente1048698 1048698 Se ejecutan al realizarse alguna de Se ejecutan al realizarse alguna de

estasestasoperacionesoperacionesndash ndash Insercioacuten InsertInsercioacuten Insertndash ndash Modificacioacuten UpdateModificacioacuten Updatendash ndash Borrado DeleteBorrado Delete

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

Variables localesVariables locales

1048698 1048698 SQL Server permite asignar valores a SQL Server permite asignar valores a las variableslas variables

dentro de una sentencia de dentro de una sentencia de actualizacioacutenactualizacioacuten

10486981048698 Update InventoryUpdate Inventory

Set mnsCost = Cost = Cost fltTaxRateSet mnsCost = Cost = Cost fltTaxRate

Where InventoryId = intInventoryIdWhere InventoryId = intInventoryId

Variables GlobalesVariables Globales

No las definimosNo las definimos1048698 1048698 El servidor las mantiene por nosotrosEl servidor las mantiene por nosotros1048698 1048698 identityidentityndash ndash Almacena el coacutedigo interno de identificacioacuten de un Almacena el coacutedigo interno de identificacioacuten de un

registroregistrondash ndash Almacena el uacuteltimo coacutedigo de la uacuteltima insercioacutenAlmacena el uacuteltimo coacutedigo de la uacuteltima insercioacuten1048698 1048698 errorerrorndash ndash 0 = No existe error0 = No existe errorndash ndash Otro valor = Indica el coacutedigo del errorOtro valor = Indica el coacutedigo del error1048698 1048698 rowcountrowcountndash ndash Nuacutemero de registros afectados en la uacuteltima Nuacutemero de registros afectados en la uacuteltima

sentenciasentencia

Variables de tipo tablaVariables de tipo tabla

Declare MyTableVar table (Id int primary Declare MyTableVar table (Id int primary key Lookupkey Lookup

varchar(15))varchar(15))

1048698 1048698 Insert MyTableVar values (1 1Q2000)Insert MyTableVar values (1 1Q2000)

1048698 1048698 Insert MyTableVar values (2 2Q2000)Insert MyTableVar values (2 2Q2000)

1048698 1048698 Insert MyTableVar values (3 3Q2000)Insert MyTableVar values (3 3Q2000)

1048698 1048698 Select from MyTableVarSelect from MyTableVar

Variables de tipo tablaVariables de tipo tabla

Las VT solo pueden aparecer como parte de las sentencias Select Las VT solo pueden aparecer como parte de las sentencias Select UpdateUpdate

1048698 1048698 Delete Insert y CursoresDelete Insert y Cursores1048698 1048698 No pueden aparecer en sentencias SELECT de insercioacuten SelectIntoNo pueden aparecer en sentencias SELECT de insercioacuten SelectInto

Select LookupId LookupSelect LookupId LookupInto TableVariable -- wrongInto TableVariable -- wrongFrom LookupFrom Lookup

1048698 1048698 No puede aparecer en sentencias de insercioacuten que utilicen No puede aparecer en sentencias de insercioacuten que utilicen procedimientosprocedimientos

alamcenadosalamcenadosInsert into TableVariable -- wrongInsert into TableVariable -- wrongExec prMyProcedureExec prMyProcedure

1048698 1048698 A diferencia de las tablas temporales las VT tienen un alcance local A diferencia de las tablas temporales las VT tienen un alcance local SoloSolo

pueden ser utilizados en el aacutembito donde fueron creadaspueden ser utilizados en el aacutembito donde fueron creadas1048698 1048698 Los cursores basados en VT tienen un alcance localLos cursores basados en VT tienen un alcance local1048698 1048698 Las VT no son objetos persistentes y no se pueden deshacer sus Las VT no son objetos persistentes y no se pueden deshacer sus

cambioscambioscon una sentencia Rollbackcon una sentencia Rollback

Procedimientos de AlmacenadoProcedimientos de Almacenado

Son procedimientos que se encuentran compilados y almacenados en el DBMSPueden realizar operaciones de mantenimiento actualizacioacuteninsercioacuten eliminacioacuten y consultaPueden recibir paracuteametros para realizar sus tareasSon excelentes para mantener seguridad encapsulamiento y para aumentar la eficiencia de las aplicaciones que funcionan coninteraccioacuten con DBMS

Procedimientos de AlmacenadoProcedimientos de Almacenado

Para crear un procedimiento almacenado usamos createalmacenados en el DBMS

create procedure miprocedimiento parametro1 tipo1

asbeginend

Un procedimiento no tiene un valor de retorno pero puede producir resultado en la forma de una o varias consultas

Restricciones de Integridad

Hasta ahora los tipos de restricciones de integridad que hemosvisto usan un modelo estaacutetico dependen de valores constantesSon controladas cada vez que el elemento asociado cambia (en cualquier forma)Hemos usado

bull Restricciones de unicidad ndash llaves primariasbull Restricciones referenciales ndash llaves foracuteaneasbull Restricciones de dominio ndash formatos de strings rangos devalores etc

Las restricciones que hemos visto son impuestas por el disentildeador de la BD y ejecutadas por el DBMS

Sentencias de control de flujoSentencias de control de flujo

1048698 1048698 IfIf

1048698 1048698 WhileWhile

1048698 1048698 BreakBreak

1048698 1048698 ContinueContinue

1048698 1048698 GoToGoTo

1048698 1048698 WaitForWaitFor

Sentencias de control de flujoSentencias de control de flujoIFIF

1048698 1048698 Esta sentencia cambia el flujo de ejecucioacutenEsta sentencia cambia el flujo de ejecucioacuten1048698 1048698 If boolean_expressionIf boolean_expression1048698 1048698 Transact-SQL_statement | statement_block Transact-SQL_statement | statement_block1048698 1048698 [else[else1048698 1048698 Transact-SQL_statement | statement_block] Transact-SQL_statement | statement_block]1048698 1048698 El valor True=Cierto=Verdadero=1El valor True=Cierto=Verdadero=11048698 1048698 El valor False=Falso=0El valor False=Falso=01048698 1048698 Si el valor es cierto ejecuta el primer bloque de Si el valor es cierto ejecuta el primer bloque de

sentencias sino el segundosentencias sino el segundo

EjemploEjemplo WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

Sentencias de control de flujoSentencias de control de flujoIF con subconsultasIF con subconsultas

1048698 1048698 Otra forma de utilizar las consultasOtra forma de utilizar las consultas

1048698 1048698 If [NOT] Exists(subquery)If [NOT] Exists(subquery)

10486981048698 Transact-SQL_statement | Transact-SQL_statement | statement_blockstatement_block

1048698 1048698 [else[else

1048698 1048698 Transact-SQL_statement | Transact-SQL_statement | statement_block]statement_block]

Sentencias de control de flujoSentencias de control de flujoWhileWhile

While Boolean_expressionWhile Boolean_expressionsql_statement | statement_blocksql_statement | statement_block[Break][Break]sql_statement | statement_blocksql_statement | statement_block[Continue][Continue]sql_statement | statement_blocksql_statement | statement_blockResto de instruccionesResto de instrucciones

1048698 1048698 True = 1 False = 0True = 1 False = 01048698 1048698 Break El servidor interrumpe el bucle y salta a la siguienteBreak El servidor interrumpe el bucle y salta a la siguienteinstruccioacuten despueacutes del bucle Resto de instruccionesinstruccioacuten despueacutes del bucle Resto de instrucciones1048698 1048698 Continue El servidor vuelve inmediatamente a la guarda del Continue El servidor vuelve inmediatamente a la guarda del

buclebucleignorando el resto de instrucciones por ejecutar despueacutes de laignorando el resto de instrucciones por ejecutar despueacutes de lasentencia continue Boolean_expressionsentencia continue Boolean_expression

Sentencias de control de flujoSentencias de control de flujoEjemplo de la instruccioacuten WhileEjemplo de la instruccioacuten While

Create Procedure prCalcFactorialCreate Procedure prCalcFactorial-- calculate factorial-- calculate factorial-- 1 = 1-- 1 = 1-- 3 = 3 2 1-- 3 = 3 2 1-- n = n (n-1) 5 4 3 2 1-- n = n (n-1) 5 4 3 2 1

N tinyintN tinyintF int OUTPUTF int OUTPUTAsAsSet F = 1Set F = 1while N gt 1while N gt 1beginbegin

set F = F Nset F = F NSet N = N - 1Set N = N - 1

endendreturn 0return 0

CursoresCursores

conjuntos de datosconjuntos de datos

Las aplicaciones de usuario estan Las aplicaciones de usuario estan desentildeadas para mostrar conjuntosdesentildeadas para mostrar conjuntos

de datos por registrosde datos por registros

Los cursores unen estos dos enfoquesLos cursores unen estos dos enfoques

Tenemos tres tipos de cursores en SQL Tenemos tres tipos de cursores en SQL ServerServer

ndash ndash Client cursorsClient cursors

ndash ndash API Server cursorsAPI Server cursors

ndash ndash Transact-SQL cursorsTransact-SQL cursors

CursoresCursoresTransact-SQL vs Resto de cursoresTransact-SQL vs Resto de cursores

La finalidad de los cursores es su La finalidad de los cursores es su principal diferenciaprincipal diferencia

1048698 1048698 Transact-SQL se utiliza enTransact-SQL se utiliza enndash ndash Los procedimientos almacenadosLos procedimientos almacenadosndash ndash Los procesos por lotesLos procesos por lotesndash ndash Las funcionesLas funcionesndash ndash Los disparadoresLos disparadores1048698 1048698 El resto de cursores se utilizan desde El resto de cursores se utilizan desde

las aplicaciones de loslas aplicaciones de losusuarios (normalmente en forma usuarios (normalmente en forma

embebida)embebida)

CursoresCursoresTransact-SQLTransact-SQL

1048698 1048698 Pasos a seguir en la definicioacuten de un cursor en un Pasos a seguir en la definicioacuten de un cursor en un procedimientoprocedimiento

almacenadoalmacenado1048698 1048698 1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1048698 1048698 2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor1048698 1048698 3 Utilizar la sentencia ldquoFetchrdquo para3 Utilizar la sentencia ldquoFetchrdquo para

ndash ndash recuperar los valores a los que apunta el cursorrecuperar los valores a los que apunta el cursorndash ndash cambiar la posicioacuten del puntero del cursorcambiar la posicioacuten del puntero del cursor

1048698 1048698 4 Ahora utilizamos los valores leidos para nuestros fines4 Ahora utilizamos los valores leidos para nuestros fines1048698 1048698 5 Si es necesario se repiten los pasos 3 y 45 Si es necesario se repiten los pasos 3 y 41048698 1048698 6 Cerramos el cursor para6 Cerramos el cursor para

ndash ndash desbloquear los datosdesbloquear los datosndash ndash liberar memorialiberar memoriandash ndash etcetc1048698 1048698 7 Eliminamos definitivamente el cursor7 Eliminamos definitivamente el cursor

Cursores EjemploCursores EjemploDefinimos los paraacutemetros y las variablesDefinimos los paraacutemetros y las variables

CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))AS AS BEGIN BEGIN

SET NOCOUNT OFF SET NOCOUNT OFF

DECLARE CAMPANA VARCHAR(20)DECLARE CAMPANA VARCHAR(20)DECLARE CODEJEC VARCHAR(10)DECLARE CODEJEC VARCHAR(10)DECLARE INDICE INTEGERDECLARE INDICE INTEGERDECLARE CORTIPOVTA CHAR(10)DECLARE CORTIPOVTA CHAR(10)

DECLARE ventas CURSOR FOR DECLARE ventas CURSOR FOR SELECT camp_tmk cod_agente indice2 cor_tipopersonaSELECT camp_tmk cod_agente indice2 cor_tipopersona FROM MON_VENTASEASIFROM MON_VENTASEASI WHERE fec_coti between FECHAINI and FECFINWHERE fec_coti between FECHAINI and FECFIN

AND cod_estado in (000PNDPRP)AND cod_estado in (000PNDPRP)

OPEN ventasOPEN ventas

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

ENDENDGOGO

Otro EjemploOtro Ejemplo

declare nombre varchar(50)declare direccion varchar(100)declare departamento_cursor cursor for

select nombre direccion from departamentoopen departamento_cursorfetch next from departamento_cursor into nombre direccionwhile fetch_status = 0begin

print(rsquoDepartamento de rsquo + nombre + rsquo Direcciacuteon rsquo + direccion)fetch next from departamento_cursor into nombre direccion

endclose departamento_cursordeallocate departamento_cursor

TriggersTriggers

No son mas que un caso particular deNo son mas que un caso particular deprocedimiento almacenadoprocedimiento almacenado1048698 1048698 No se pueden ejecutar directamenteNo se pueden ejecutar directamente1048698 1048698 Se ejecutan al realizarse alguna de Se ejecutan al realizarse alguna de

estasestasoperacionesoperacionesndash ndash Insercioacuten InsertInsercioacuten Insertndash ndash Modificacioacuten UpdateModificacioacuten Updatendash ndash Borrado DeleteBorrado Delete

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

Variables GlobalesVariables Globales

No las definimosNo las definimos1048698 1048698 El servidor las mantiene por nosotrosEl servidor las mantiene por nosotros1048698 1048698 identityidentityndash ndash Almacena el coacutedigo interno de identificacioacuten de un Almacena el coacutedigo interno de identificacioacuten de un

registroregistrondash ndash Almacena el uacuteltimo coacutedigo de la uacuteltima insercioacutenAlmacena el uacuteltimo coacutedigo de la uacuteltima insercioacuten1048698 1048698 errorerrorndash ndash 0 = No existe error0 = No existe errorndash ndash Otro valor = Indica el coacutedigo del errorOtro valor = Indica el coacutedigo del error1048698 1048698 rowcountrowcountndash ndash Nuacutemero de registros afectados en la uacuteltima Nuacutemero de registros afectados en la uacuteltima

sentenciasentencia

Variables de tipo tablaVariables de tipo tabla

Declare MyTableVar table (Id int primary Declare MyTableVar table (Id int primary key Lookupkey Lookup

varchar(15))varchar(15))

1048698 1048698 Insert MyTableVar values (1 1Q2000)Insert MyTableVar values (1 1Q2000)

1048698 1048698 Insert MyTableVar values (2 2Q2000)Insert MyTableVar values (2 2Q2000)

1048698 1048698 Insert MyTableVar values (3 3Q2000)Insert MyTableVar values (3 3Q2000)

1048698 1048698 Select from MyTableVarSelect from MyTableVar

Variables de tipo tablaVariables de tipo tabla

Las VT solo pueden aparecer como parte de las sentencias Select Las VT solo pueden aparecer como parte de las sentencias Select UpdateUpdate

1048698 1048698 Delete Insert y CursoresDelete Insert y Cursores1048698 1048698 No pueden aparecer en sentencias SELECT de insercioacuten SelectIntoNo pueden aparecer en sentencias SELECT de insercioacuten SelectInto

Select LookupId LookupSelect LookupId LookupInto TableVariable -- wrongInto TableVariable -- wrongFrom LookupFrom Lookup

1048698 1048698 No puede aparecer en sentencias de insercioacuten que utilicen No puede aparecer en sentencias de insercioacuten que utilicen procedimientosprocedimientos

alamcenadosalamcenadosInsert into TableVariable -- wrongInsert into TableVariable -- wrongExec prMyProcedureExec prMyProcedure

1048698 1048698 A diferencia de las tablas temporales las VT tienen un alcance local A diferencia de las tablas temporales las VT tienen un alcance local SoloSolo

pueden ser utilizados en el aacutembito donde fueron creadaspueden ser utilizados en el aacutembito donde fueron creadas1048698 1048698 Los cursores basados en VT tienen un alcance localLos cursores basados en VT tienen un alcance local1048698 1048698 Las VT no son objetos persistentes y no se pueden deshacer sus Las VT no son objetos persistentes y no se pueden deshacer sus

cambioscambioscon una sentencia Rollbackcon una sentencia Rollback

Procedimientos de AlmacenadoProcedimientos de Almacenado

Son procedimientos que se encuentran compilados y almacenados en el DBMSPueden realizar operaciones de mantenimiento actualizacioacuteninsercioacuten eliminacioacuten y consultaPueden recibir paracuteametros para realizar sus tareasSon excelentes para mantener seguridad encapsulamiento y para aumentar la eficiencia de las aplicaciones que funcionan coninteraccioacuten con DBMS

Procedimientos de AlmacenadoProcedimientos de Almacenado

Para crear un procedimiento almacenado usamos createalmacenados en el DBMS

create procedure miprocedimiento parametro1 tipo1

asbeginend

Un procedimiento no tiene un valor de retorno pero puede producir resultado en la forma de una o varias consultas

Restricciones de Integridad

Hasta ahora los tipos de restricciones de integridad que hemosvisto usan un modelo estaacutetico dependen de valores constantesSon controladas cada vez que el elemento asociado cambia (en cualquier forma)Hemos usado

bull Restricciones de unicidad ndash llaves primariasbull Restricciones referenciales ndash llaves foracuteaneasbull Restricciones de dominio ndash formatos de strings rangos devalores etc

Las restricciones que hemos visto son impuestas por el disentildeador de la BD y ejecutadas por el DBMS

Sentencias de control de flujoSentencias de control de flujo

1048698 1048698 IfIf

1048698 1048698 WhileWhile

1048698 1048698 BreakBreak

1048698 1048698 ContinueContinue

1048698 1048698 GoToGoTo

1048698 1048698 WaitForWaitFor

Sentencias de control de flujoSentencias de control de flujoIFIF

1048698 1048698 Esta sentencia cambia el flujo de ejecucioacutenEsta sentencia cambia el flujo de ejecucioacuten1048698 1048698 If boolean_expressionIf boolean_expression1048698 1048698 Transact-SQL_statement | statement_block Transact-SQL_statement | statement_block1048698 1048698 [else[else1048698 1048698 Transact-SQL_statement | statement_block] Transact-SQL_statement | statement_block]1048698 1048698 El valor True=Cierto=Verdadero=1El valor True=Cierto=Verdadero=11048698 1048698 El valor False=Falso=0El valor False=Falso=01048698 1048698 Si el valor es cierto ejecuta el primer bloque de Si el valor es cierto ejecuta el primer bloque de

sentencias sino el segundosentencias sino el segundo

EjemploEjemplo WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

Sentencias de control de flujoSentencias de control de flujoIF con subconsultasIF con subconsultas

1048698 1048698 Otra forma de utilizar las consultasOtra forma de utilizar las consultas

1048698 1048698 If [NOT] Exists(subquery)If [NOT] Exists(subquery)

10486981048698 Transact-SQL_statement | Transact-SQL_statement | statement_blockstatement_block

1048698 1048698 [else[else

1048698 1048698 Transact-SQL_statement | Transact-SQL_statement | statement_block]statement_block]

Sentencias de control de flujoSentencias de control de flujoWhileWhile

While Boolean_expressionWhile Boolean_expressionsql_statement | statement_blocksql_statement | statement_block[Break][Break]sql_statement | statement_blocksql_statement | statement_block[Continue][Continue]sql_statement | statement_blocksql_statement | statement_blockResto de instruccionesResto de instrucciones

1048698 1048698 True = 1 False = 0True = 1 False = 01048698 1048698 Break El servidor interrumpe el bucle y salta a la siguienteBreak El servidor interrumpe el bucle y salta a la siguienteinstruccioacuten despueacutes del bucle Resto de instruccionesinstruccioacuten despueacutes del bucle Resto de instrucciones1048698 1048698 Continue El servidor vuelve inmediatamente a la guarda del Continue El servidor vuelve inmediatamente a la guarda del

buclebucleignorando el resto de instrucciones por ejecutar despueacutes de laignorando el resto de instrucciones por ejecutar despueacutes de lasentencia continue Boolean_expressionsentencia continue Boolean_expression

Sentencias de control de flujoSentencias de control de flujoEjemplo de la instruccioacuten WhileEjemplo de la instruccioacuten While

Create Procedure prCalcFactorialCreate Procedure prCalcFactorial-- calculate factorial-- calculate factorial-- 1 = 1-- 1 = 1-- 3 = 3 2 1-- 3 = 3 2 1-- n = n (n-1) 5 4 3 2 1-- n = n (n-1) 5 4 3 2 1

N tinyintN tinyintF int OUTPUTF int OUTPUTAsAsSet F = 1Set F = 1while N gt 1while N gt 1beginbegin

set F = F Nset F = F NSet N = N - 1Set N = N - 1

endendreturn 0return 0

CursoresCursores

conjuntos de datosconjuntos de datos

Las aplicaciones de usuario estan Las aplicaciones de usuario estan desentildeadas para mostrar conjuntosdesentildeadas para mostrar conjuntos

de datos por registrosde datos por registros

Los cursores unen estos dos enfoquesLos cursores unen estos dos enfoques

Tenemos tres tipos de cursores en SQL Tenemos tres tipos de cursores en SQL ServerServer

ndash ndash Client cursorsClient cursors

ndash ndash API Server cursorsAPI Server cursors

ndash ndash Transact-SQL cursorsTransact-SQL cursors

CursoresCursoresTransact-SQL vs Resto de cursoresTransact-SQL vs Resto de cursores

La finalidad de los cursores es su La finalidad de los cursores es su principal diferenciaprincipal diferencia

1048698 1048698 Transact-SQL se utiliza enTransact-SQL se utiliza enndash ndash Los procedimientos almacenadosLos procedimientos almacenadosndash ndash Los procesos por lotesLos procesos por lotesndash ndash Las funcionesLas funcionesndash ndash Los disparadoresLos disparadores1048698 1048698 El resto de cursores se utilizan desde El resto de cursores se utilizan desde

las aplicaciones de loslas aplicaciones de losusuarios (normalmente en forma usuarios (normalmente en forma

embebida)embebida)

CursoresCursoresTransact-SQLTransact-SQL

1048698 1048698 Pasos a seguir en la definicioacuten de un cursor en un Pasos a seguir en la definicioacuten de un cursor en un procedimientoprocedimiento

almacenadoalmacenado1048698 1048698 1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1048698 1048698 2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor1048698 1048698 3 Utilizar la sentencia ldquoFetchrdquo para3 Utilizar la sentencia ldquoFetchrdquo para

ndash ndash recuperar los valores a los que apunta el cursorrecuperar los valores a los que apunta el cursorndash ndash cambiar la posicioacuten del puntero del cursorcambiar la posicioacuten del puntero del cursor

1048698 1048698 4 Ahora utilizamos los valores leidos para nuestros fines4 Ahora utilizamos los valores leidos para nuestros fines1048698 1048698 5 Si es necesario se repiten los pasos 3 y 45 Si es necesario se repiten los pasos 3 y 41048698 1048698 6 Cerramos el cursor para6 Cerramos el cursor para

ndash ndash desbloquear los datosdesbloquear los datosndash ndash liberar memorialiberar memoriandash ndash etcetc1048698 1048698 7 Eliminamos definitivamente el cursor7 Eliminamos definitivamente el cursor

Cursores EjemploCursores EjemploDefinimos los paraacutemetros y las variablesDefinimos los paraacutemetros y las variables

CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))AS AS BEGIN BEGIN

SET NOCOUNT OFF SET NOCOUNT OFF

DECLARE CAMPANA VARCHAR(20)DECLARE CAMPANA VARCHAR(20)DECLARE CODEJEC VARCHAR(10)DECLARE CODEJEC VARCHAR(10)DECLARE INDICE INTEGERDECLARE INDICE INTEGERDECLARE CORTIPOVTA CHAR(10)DECLARE CORTIPOVTA CHAR(10)

DECLARE ventas CURSOR FOR DECLARE ventas CURSOR FOR SELECT camp_tmk cod_agente indice2 cor_tipopersonaSELECT camp_tmk cod_agente indice2 cor_tipopersona FROM MON_VENTASEASIFROM MON_VENTASEASI WHERE fec_coti between FECHAINI and FECFINWHERE fec_coti between FECHAINI and FECFIN

AND cod_estado in (000PNDPRP)AND cod_estado in (000PNDPRP)

OPEN ventasOPEN ventas

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

ENDENDGOGO

Otro EjemploOtro Ejemplo

declare nombre varchar(50)declare direccion varchar(100)declare departamento_cursor cursor for

select nombre direccion from departamentoopen departamento_cursorfetch next from departamento_cursor into nombre direccionwhile fetch_status = 0begin

print(rsquoDepartamento de rsquo + nombre + rsquo Direcciacuteon rsquo + direccion)fetch next from departamento_cursor into nombre direccion

endclose departamento_cursordeallocate departamento_cursor

TriggersTriggers

No son mas que un caso particular deNo son mas que un caso particular deprocedimiento almacenadoprocedimiento almacenado1048698 1048698 No se pueden ejecutar directamenteNo se pueden ejecutar directamente1048698 1048698 Se ejecutan al realizarse alguna de Se ejecutan al realizarse alguna de

estasestasoperacionesoperacionesndash ndash Insercioacuten InsertInsercioacuten Insertndash ndash Modificacioacuten UpdateModificacioacuten Updatendash ndash Borrado DeleteBorrado Delete

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

Variables de tipo tablaVariables de tipo tabla

Declare MyTableVar table (Id int primary Declare MyTableVar table (Id int primary key Lookupkey Lookup

varchar(15))varchar(15))

1048698 1048698 Insert MyTableVar values (1 1Q2000)Insert MyTableVar values (1 1Q2000)

1048698 1048698 Insert MyTableVar values (2 2Q2000)Insert MyTableVar values (2 2Q2000)

1048698 1048698 Insert MyTableVar values (3 3Q2000)Insert MyTableVar values (3 3Q2000)

1048698 1048698 Select from MyTableVarSelect from MyTableVar

Variables de tipo tablaVariables de tipo tabla

Las VT solo pueden aparecer como parte de las sentencias Select Las VT solo pueden aparecer como parte de las sentencias Select UpdateUpdate

1048698 1048698 Delete Insert y CursoresDelete Insert y Cursores1048698 1048698 No pueden aparecer en sentencias SELECT de insercioacuten SelectIntoNo pueden aparecer en sentencias SELECT de insercioacuten SelectInto

Select LookupId LookupSelect LookupId LookupInto TableVariable -- wrongInto TableVariable -- wrongFrom LookupFrom Lookup

1048698 1048698 No puede aparecer en sentencias de insercioacuten que utilicen No puede aparecer en sentencias de insercioacuten que utilicen procedimientosprocedimientos

alamcenadosalamcenadosInsert into TableVariable -- wrongInsert into TableVariable -- wrongExec prMyProcedureExec prMyProcedure

1048698 1048698 A diferencia de las tablas temporales las VT tienen un alcance local A diferencia de las tablas temporales las VT tienen un alcance local SoloSolo

pueden ser utilizados en el aacutembito donde fueron creadaspueden ser utilizados en el aacutembito donde fueron creadas1048698 1048698 Los cursores basados en VT tienen un alcance localLos cursores basados en VT tienen un alcance local1048698 1048698 Las VT no son objetos persistentes y no se pueden deshacer sus Las VT no son objetos persistentes y no se pueden deshacer sus

cambioscambioscon una sentencia Rollbackcon una sentencia Rollback

Procedimientos de AlmacenadoProcedimientos de Almacenado

Son procedimientos que se encuentran compilados y almacenados en el DBMSPueden realizar operaciones de mantenimiento actualizacioacuteninsercioacuten eliminacioacuten y consultaPueden recibir paracuteametros para realizar sus tareasSon excelentes para mantener seguridad encapsulamiento y para aumentar la eficiencia de las aplicaciones que funcionan coninteraccioacuten con DBMS

Procedimientos de AlmacenadoProcedimientos de Almacenado

Para crear un procedimiento almacenado usamos createalmacenados en el DBMS

create procedure miprocedimiento parametro1 tipo1

asbeginend

Un procedimiento no tiene un valor de retorno pero puede producir resultado en la forma de una o varias consultas

Restricciones de Integridad

Hasta ahora los tipos de restricciones de integridad que hemosvisto usan un modelo estaacutetico dependen de valores constantesSon controladas cada vez que el elemento asociado cambia (en cualquier forma)Hemos usado

bull Restricciones de unicidad ndash llaves primariasbull Restricciones referenciales ndash llaves foracuteaneasbull Restricciones de dominio ndash formatos de strings rangos devalores etc

Las restricciones que hemos visto son impuestas por el disentildeador de la BD y ejecutadas por el DBMS

Sentencias de control de flujoSentencias de control de flujo

1048698 1048698 IfIf

1048698 1048698 WhileWhile

1048698 1048698 BreakBreak

1048698 1048698 ContinueContinue

1048698 1048698 GoToGoTo

1048698 1048698 WaitForWaitFor

Sentencias de control de flujoSentencias de control de flujoIFIF

1048698 1048698 Esta sentencia cambia el flujo de ejecucioacutenEsta sentencia cambia el flujo de ejecucioacuten1048698 1048698 If boolean_expressionIf boolean_expression1048698 1048698 Transact-SQL_statement | statement_block Transact-SQL_statement | statement_block1048698 1048698 [else[else1048698 1048698 Transact-SQL_statement | statement_block] Transact-SQL_statement | statement_block]1048698 1048698 El valor True=Cierto=Verdadero=1El valor True=Cierto=Verdadero=11048698 1048698 El valor False=Falso=0El valor False=Falso=01048698 1048698 Si el valor es cierto ejecuta el primer bloque de Si el valor es cierto ejecuta el primer bloque de

sentencias sino el segundosentencias sino el segundo

EjemploEjemplo WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

Sentencias de control de flujoSentencias de control de flujoIF con subconsultasIF con subconsultas

1048698 1048698 Otra forma de utilizar las consultasOtra forma de utilizar las consultas

1048698 1048698 If [NOT] Exists(subquery)If [NOT] Exists(subquery)

10486981048698 Transact-SQL_statement | Transact-SQL_statement | statement_blockstatement_block

1048698 1048698 [else[else

1048698 1048698 Transact-SQL_statement | Transact-SQL_statement | statement_block]statement_block]

Sentencias de control de flujoSentencias de control de flujoWhileWhile

While Boolean_expressionWhile Boolean_expressionsql_statement | statement_blocksql_statement | statement_block[Break][Break]sql_statement | statement_blocksql_statement | statement_block[Continue][Continue]sql_statement | statement_blocksql_statement | statement_blockResto de instruccionesResto de instrucciones

1048698 1048698 True = 1 False = 0True = 1 False = 01048698 1048698 Break El servidor interrumpe el bucle y salta a la siguienteBreak El servidor interrumpe el bucle y salta a la siguienteinstruccioacuten despueacutes del bucle Resto de instruccionesinstruccioacuten despueacutes del bucle Resto de instrucciones1048698 1048698 Continue El servidor vuelve inmediatamente a la guarda del Continue El servidor vuelve inmediatamente a la guarda del

buclebucleignorando el resto de instrucciones por ejecutar despueacutes de laignorando el resto de instrucciones por ejecutar despueacutes de lasentencia continue Boolean_expressionsentencia continue Boolean_expression

Sentencias de control de flujoSentencias de control de flujoEjemplo de la instruccioacuten WhileEjemplo de la instruccioacuten While

Create Procedure prCalcFactorialCreate Procedure prCalcFactorial-- calculate factorial-- calculate factorial-- 1 = 1-- 1 = 1-- 3 = 3 2 1-- 3 = 3 2 1-- n = n (n-1) 5 4 3 2 1-- n = n (n-1) 5 4 3 2 1

N tinyintN tinyintF int OUTPUTF int OUTPUTAsAsSet F = 1Set F = 1while N gt 1while N gt 1beginbegin

set F = F Nset F = F NSet N = N - 1Set N = N - 1

endendreturn 0return 0

CursoresCursores

conjuntos de datosconjuntos de datos

Las aplicaciones de usuario estan Las aplicaciones de usuario estan desentildeadas para mostrar conjuntosdesentildeadas para mostrar conjuntos

de datos por registrosde datos por registros

Los cursores unen estos dos enfoquesLos cursores unen estos dos enfoques

Tenemos tres tipos de cursores en SQL Tenemos tres tipos de cursores en SQL ServerServer

ndash ndash Client cursorsClient cursors

ndash ndash API Server cursorsAPI Server cursors

ndash ndash Transact-SQL cursorsTransact-SQL cursors

CursoresCursoresTransact-SQL vs Resto de cursoresTransact-SQL vs Resto de cursores

La finalidad de los cursores es su La finalidad de los cursores es su principal diferenciaprincipal diferencia

1048698 1048698 Transact-SQL se utiliza enTransact-SQL se utiliza enndash ndash Los procedimientos almacenadosLos procedimientos almacenadosndash ndash Los procesos por lotesLos procesos por lotesndash ndash Las funcionesLas funcionesndash ndash Los disparadoresLos disparadores1048698 1048698 El resto de cursores se utilizan desde El resto de cursores se utilizan desde

las aplicaciones de loslas aplicaciones de losusuarios (normalmente en forma usuarios (normalmente en forma

embebida)embebida)

CursoresCursoresTransact-SQLTransact-SQL

1048698 1048698 Pasos a seguir en la definicioacuten de un cursor en un Pasos a seguir en la definicioacuten de un cursor en un procedimientoprocedimiento

almacenadoalmacenado1048698 1048698 1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1048698 1048698 2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor1048698 1048698 3 Utilizar la sentencia ldquoFetchrdquo para3 Utilizar la sentencia ldquoFetchrdquo para

ndash ndash recuperar los valores a los que apunta el cursorrecuperar los valores a los que apunta el cursorndash ndash cambiar la posicioacuten del puntero del cursorcambiar la posicioacuten del puntero del cursor

1048698 1048698 4 Ahora utilizamos los valores leidos para nuestros fines4 Ahora utilizamos los valores leidos para nuestros fines1048698 1048698 5 Si es necesario se repiten los pasos 3 y 45 Si es necesario se repiten los pasos 3 y 41048698 1048698 6 Cerramos el cursor para6 Cerramos el cursor para

ndash ndash desbloquear los datosdesbloquear los datosndash ndash liberar memorialiberar memoriandash ndash etcetc1048698 1048698 7 Eliminamos definitivamente el cursor7 Eliminamos definitivamente el cursor

Cursores EjemploCursores EjemploDefinimos los paraacutemetros y las variablesDefinimos los paraacutemetros y las variables

CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))AS AS BEGIN BEGIN

SET NOCOUNT OFF SET NOCOUNT OFF

DECLARE CAMPANA VARCHAR(20)DECLARE CAMPANA VARCHAR(20)DECLARE CODEJEC VARCHAR(10)DECLARE CODEJEC VARCHAR(10)DECLARE INDICE INTEGERDECLARE INDICE INTEGERDECLARE CORTIPOVTA CHAR(10)DECLARE CORTIPOVTA CHAR(10)

DECLARE ventas CURSOR FOR DECLARE ventas CURSOR FOR SELECT camp_tmk cod_agente indice2 cor_tipopersonaSELECT camp_tmk cod_agente indice2 cor_tipopersona FROM MON_VENTASEASIFROM MON_VENTASEASI WHERE fec_coti between FECHAINI and FECFINWHERE fec_coti between FECHAINI and FECFIN

AND cod_estado in (000PNDPRP)AND cod_estado in (000PNDPRP)

OPEN ventasOPEN ventas

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

ENDENDGOGO

Otro EjemploOtro Ejemplo

declare nombre varchar(50)declare direccion varchar(100)declare departamento_cursor cursor for

select nombre direccion from departamentoopen departamento_cursorfetch next from departamento_cursor into nombre direccionwhile fetch_status = 0begin

print(rsquoDepartamento de rsquo + nombre + rsquo Direcciacuteon rsquo + direccion)fetch next from departamento_cursor into nombre direccion

endclose departamento_cursordeallocate departamento_cursor

TriggersTriggers

No son mas que un caso particular deNo son mas que un caso particular deprocedimiento almacenadoprocedimiento almacenado1048698 1048698 No se pueden ejecutar directamenteNo se pueden ejecutar directamente1048698 1048698 Se ejecutan al realizarse alguna de Se ejecutan al realizarse alguna de

estasestasoperacionesoperacionesndash ndash Insercioacuten InsertInsercioacuten Insertndash ndash Modificacioacuten UpdateModificacioacuten Updatendash ndash Borrado DeleteBorrado Delete

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

Variables de tipo tablaVariables de tipo tabla

Las VT solo pueden aparecer como parte de las sentencias Select Las VT solo pueden aparecer como parte de las sentencias Select UpdateUpdate

1048698 1048698 Delete Insert y CursoresDelete Insert y Cursores1048698 1048698 No pueden aparecer en sentencias SELECT de insercioacuten SelectIntoNo pueden aparecer en sentencias SELECT de insercioacuten SelectInto

Select LookupId LookupSelect LookupId LookupInto TableVariable -- wrongInto TableVariable -- wrongFrom LookupFrom Lookup

1048698 1048698 No puede aparecer en sentencias de insercioacuten que utilicen No puede aparecer en sentencias de insercioacuten que utilicen procedimientosprocedimientos

alamcenadosalamcenadosInsert into TableVariable -- wrongInsert into TableVariable -- wrongExec prMyProcedureExec prMyProcedure

1048698 1048698 A diferencia de las tablas temporales las VT tienen un alcance local A diferencia de las tablas temporales las VT tienen un alcance local SoloSolo

pueden ser utilizados en el aacutembito donde fueron creadaspueden ser utilizados en el aacutembito donde fueron creadas1048698 1048698 Los cursores basados en VT tienen un alcance localLos cursores basados en VT tienen un alcance local1048698 1048698 Las VT no son objetos persistentes y no se pueden deshacer sus Las VT no son objetos persistentes y no se pueden deshacer sus

cambioscambioscon una sentencia Rollbackcon una sentencia Rollback

Procedimientos de AlmacenadoProcedimientos de Almacenado

Son procedimientos que se encuentran compilados y almacenados en el DBMSPueden realizar operaciones de mantenimiento actualizacioacuteninsercioacuten eliminacioacuten y consultaPueden recibir paracuteametros para realizar sus tareasSon excelentes para mantener seguridad encapsulamiento y para aumentar la eficiencia de las aplicaciones que funcionan coninteraccioacuten con DBMS

Procedimientos de AlmacenadoProcedimientos de Almacenado

Para crear un procedimiento almacenado usamos createalmacenados en el DBMS

create procedure miprocedimiento parametro1 tipo1

asbeginend

Un procedimiento no tiene un valor de retorno pero puede producir resultado en la forma de una o varias consultas

Restricciones de Integridad

Hasta ahora los tipos de restricciones de integridad que hemosvisto usan un modelo estaacutetico dependen de valores constantesSon controladas cada vez que el elemento asociado cambia (en cualquier forma)Hemos usado

bull Restricciones de unicidad ndash llaves primariasbull Restricciones referenciales ndash llaves foracuteaneasbull Restricciones de dominio ndash formatos de strings rangos devalores etc

Las restricciones que hemos visto son impuestas por el disentildeador de la BD y ejecutadas por el DBMS

Sentencias de control de flujoSentencias de control de flujo

1048698 1048698 IfIf

1048698 1048698 WhileWhile

1048698 1048698 BreakBreak

1048698 1048698 ContinueContinue

1048698 1048698 GoToGoTo

1048698 1048698 WaitForWaitFor

Sentencias de control de flujoSentencias de control de flujoIFIF

1048698 1048698 Esta sentencia cambia el flujo de ejecucioacutenEsta sentencia cambia el flujo de ejecucioacuten1048698 1048698 If boolean_expressionIf boolean_expression1048698 1048698 Transact-SQL_statement | statement_block Transact-SQL_statement | statement_block1048698 1048698 [else[else1048698 1048698 Transact-SQL_statement | statement_block] Transact-SQL_statement | statement_block]1048698 1048698 El valor True=Cierto=Verdadero=1El valor True=Cierto=Verdadero=11048698 1048698 El valor False=Falso=0El valor False=Falso=01048698 1048698 Si el valor es cierto ejecuta el primer bloque de Si el valor es cierto ejecuta el primer bloque de

sentencias sino el segundosentencias sino el segundo

EjemploEjemplo WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

Sentencias de control de flujoSentencias de control de flujoIF con subconsultasIF con subconsultas

1048698 1048698 Otra forma de utilizar las consultasOtra forma de utilizar las consultas

1048698 1048698 If [NOT] Exists(subquery)If [NOT] Exists(subquery)

10486981048698 Transact-SQL_statement | Transact-SQL_statement | statement_blockstatement_block

1048698 1048698 [else[else

1048698 1048698 Transact-SQL_statement | Transact-SQL_statement | statement_block]statement_block]

Sentencias de control de flujoSentencias de control de flujoWhileWhile

While Boolean_expressionWhile Boolean_expressionsql_statement | statement_blocksql_statement | statement_block[Break][Break]sql_statement | statement_blocksql_statement | statement_block[Continue][Continue]sql_statement | statement_blocksql_statement | statement_blockResto de instruccionesResto de instrucciones

1048698 1048698 True = 1 False = 0True = 1 False = 01048698 1048698 Break El servidor interrumpe el bucle y salta a la siguienteBreak El servidor interrumpe el bucle y salta a la siguienteinstruccioacuten despueacutes del bucle Resto de instruccionesinstruccioacuten despueacutes del bucle Resto de instrucciones1048698 1048698 Continue El servidor vuelve inmediatamente a la guarda del Continue El servidor vuelve inmediatamente a la guarda del

buclebucleignorando el resto de instrucciones por ejecutar despueacutes de laignorando el resto de instrucciones por ejecutar despueacutes de lasentencia continue Boolean_expressionsentencia continue Boolean_expression

Sentencias de control de flujoSentencias de control de flujoEjemplo de la instruccioacuten WhileEjemplo de la instruccioacuten While

Create Procedure prCalcFactorialCreate Procedure prCalcFactorial-- calculate factorial-- calculate factorial-- 1 = 1-- 1 = 1-- 3 = 3 2 1-- 3 = 3 2 1-- n = n (n-1) 5 4 3 2 1-- n = n (n-1) 5 4 3 2 1

N tinyintN tinyintF int OUTPUTF int OUTPUTAsAsSet F = 1Set F = 1while N gt 1while N gt 1beginbegin

set F = F Nset F = F NSet N = N - 1Set N = N - 1

endendreturn 0return 0

CursoresCursores

conjuntos de datosconjuntos de datos

Las aplicaciones de usuario estan Las aplicaciones de usuario estan desentildeadas para mostrar conjuntosdesentildeadas para mostrar conjuntos

de datos por registrosde datos por registros

Los cursores unen estos dos enfoquesLos cursores unen estos dos enfoques

Tenemos tres tipos de cursores en SQL Tenemos tres tipos de cursores en SQL ServerServer

ndash ndash Client cursorsClient cursors

ndash ndash API Server cursorsAPI Server cursors

ndash ndash Transact-SQL cursorsTransact-SQL cursors

CursoresCursoresTransact-SQL vs Resto de cursoresTransact-SQL vs Resto de cursores

La finalidad de los cursores es su La finalidad de los cursores es su principal diferenciaprincipal diferencia

1048698 1048698 Transact-SQL se utiliza enTransact-SQL se utiliza enndash ndash Los procedimientos almacenadosLos procedimientos almacenadosndash ndash Los procesos por lotesLos procesos por lotesndash ndash Las funcionesLas funcionesndash ndash Los disparadoresLos disparadores1048698 1048698 El resto de cursores se utilizan desde El resto de cursores se utilizan desde

las aplicaciones de loslas aplicaciones de losusuarios (normalmente en forma usuarios (normalmente en forma

embebida)embebida)

CursoresCursoresTransact-SQLTransact-SQL

1048698 1048698 Pasos a seguir en la definicioacuten de un cursor en un Pasos a seguir en la definicioacuten de un cursor en un procedimientoprocedimiento

almacenadoalmacenado1048698 1048698 1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1048698 1048698 2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor1048698 1048698 3 Utilizar la sentencia ldquoFetchrdquo para3 Utilizar la sentencia ldquoFetchrdquo para

ndash ndash recuperar los valores a los que apunta el cursorrecuperar los valores a los que apunta el cursorndash ndash cambiar la posicioacuten del puntero del cursorcambiar la posicioacuten del puntero del cursor

1048698 1048698 4 Ahora utilizamos los valores leidos para nuestros fines4 Ahora utilizamos los valores leidos para nuestros fines1048698 1048698 5 Si es necesario se repiten los pasos 3 y 45 Si es necesario se repiten los pasos 3 y 41048698 1048698 6 Cerramos el cursor para6 Cerramos el cursor para

ndash ndash desbloquear los datosdesbloquear los datosndash ndash liberar memorialiberar memoriandash ndash etcetc1048698 1048698 7 Eliminamos definitivamente el cursor7 Eliminamos definitivamente el cursor

Cursores EjemploCursores EjemploDefinimos los paraacutemetros y las variablesDefinimos los paraacutemetros y las variables

CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))AS AS BEGIN BEGIN

SET NOCOUNT OFF SET NOCOUNT OFF

DECLARE CAMPANA VARCHAR(20)DECLARE CAMPANA VARCHAR(20)DECLARE CODEJEC VARCHAR(10)DECLARE CODEJEC VARCHAR(10)DECLARE INDICE INTEGERDECLARE INDICE INTEGERDECLARE CORTIPOVTA CHAR(10)DECLARE CORTIPOVTA CHAR(10)

DECLARE ventas CURSOR FOR DECLARE ventas CURSOR FOR SELECT camp_tmk cod_agente indice2 cor_tipopersonaSELECT camp_tmk cod_agente indice2 cor_tipopersona FROM MON_VENTASEASIFROM MON_VENTASEASI WHERE fec_coti between FECHAINI and FECFINWHERE fec_coti between FECHAINI and FECFIN

AND cod_estado in (000PNDPRP)AND cod_estado in (000PNDPRP)

OPEN ventasOPEN ventas

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

ENDENDGOGO

Otro EjemploOtro Ejemplo

declare nombre varchar(50)declare direccion varchar(100)declare departamento_cursor cursor for

select nombre direccion from departamentoopen departamento_cursorfetch next from departamento_cursor into nombre direccionwhile fetch_status = 0begin

print(rsquoDepartamento de rsquo + nombre + rsquo Direcciacuteon rsquo + direccion)fetch next from departamento_cursor into nombre direccion

endclose departamento_cursordeallocate departamento_cursor

TriggersTriggers

No son mas que un caso particular deNo son mas que un caso particular deprocedimiento almacenadoprocedimiento almacenado1048698 1048698 No se pueden ejecutar directamenteNo se pueden ejecutar directamente1048698 1048698 Se ejecutan al realizarse alguna de Se ejecutan al realizarse alguna de

estasestasoperacionesoperacionesndash ndash Insercioacuten InsertInsercioacuten Insertndash ndash Modificacioacuten UpdateModificacioacuten Updatendash ndash Borrado DeleteBorrado Delete

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

Procedimientos de AlmacenadoProcedimientos de Almacenado

Son procedimientos que se encuentran compilados y almacenados en el DBMSPueden realizar operaciones de mantenimiento actualizacioacuteninsercioacuten eliminacioacuten y consultaPueden recibir paracuteametros para realizar sus tareasSon excelentes para mantener seguridad encapsulamiento y para aumentar la eficiencia de las aplicaciones que funcionan coninteraccioacuten con DBMS

Procedimientos de AlmacenadoProcedimientos de Almacenado

Para crear un procedimiento almacenado usamos createalmacenados en el DBMS

create procedure miprocedimiento parametro1 tipo1

asbeginend

Un procedimiento no tiene un valor de retorno pero puede producir resultado en la forma de una o varias consultas

Restricciones de Integridad

Hasta ahora los tipos de restricciones de integridad que hemosvisto usan un modelo estaacutetico dependen de valores constantesSon controladas cada vez que el elemento asociado cambia (en cualquier forma)Hemos usado

bull Restricciones de unicidad ndash llaves primariasbull Restricciones referenciales ndash llaves foracuteaneasbull Restricciones de dominio ndash formatos de strings rangos devalores etc

Las restricciones que hemos visto son impuestas por el disentildeador de la BD y ejecutadas por el DBMS

Sentencias de control de flujoSentencias de control de flujo

1048698 1048698 IfIf

1048698 1048698 WhileWhile

1048698 1048698 BreakBreak

1048698 1048698 ContinueContinue

1048698 1048698 GoToGoTo

1048698 1048698 WaitForWaitFor

Sentencias de control de flujoSentencias de control de flujoIFIF

1048698 1048698 Esta sentencia cambia el flujo de ejecucioacutenEsta sentencia cambia el flujo de ejecucioacuten1048698 1048698 If boolean_expressionIf boolean_expression1048698 1048698 Transact-SQL_statement | statement_block Transact-SQL_statement | statement_block1048698 1048698 [else[else1048698 1048698 Transact-SQL_statement | statement_block] Transact-SQL_statement | statement_block]1048698 1048698 El valor True=Cierto=Verdadero=1El valor True=Cierto=Verdadero=11048698 1048698 El valor False=Falso=0El valor False=Falso=01048698 1048698 Si el valor es cierto ejecuta el primer bloque de Si el valor es cierto ejecuta el primer bloque de

sentencias sino el segundosentencias sino el segundo

EjemploEjemplo WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

Sentencias de control de flujoSentencias de control de flujoIF con subconsultasIF con subconsultas

1048698 1048698 Otra forma de utilizar las consultasOtra forma de utilizar las consultas

1048698 1048698 If [NOT] Exists(subquery)If [NOT] Exists(subquery)

10486981048698 Transact-SQL_statement | Transact-SQL_statement | statement_blockstatement_block

1048698 1048698 [else[else

1048698 1048698 Transact-SQL_statement | Transact-SQL_statement | statement_block]statement_block]

Sentencias de control de flujoSentencias de control de flujoWhileWhile

While Boolean_expressionWhile Boolean_expressionsql_statement | statement_blocksql_statement | statement_block[Break][Break]sql_statement | statement_blocksql_statement | statement_block[Continue][Continue]sql_statement | statement_blocksql_statement | statement_blockResto de instruccionesResto de instrucciones

1048698 1048698 True = 1 False = 0True = 1 False = 01048698 1048698 Break El servidor interrumpe el bucle y salta a la siguienteBreak El servidor interrumpe el bucle y salta a la siguienteinstruccioacuten despueacutes del bucle Resto de instruccionesinstruccioacuten despueacutes del bucle Resto de instrucciones1048698 1048698 Continue El servidor vuelve inmediatamente a la guarda del Continue El servidor vuelve inmediatamente a la guarda del

buclebucleignorando el resto de instrucciones por ejecutar despueacutes de laignorando el resto de instrucciones por ejecutar despueacutes de lasentencia continue Boolean_expressionsentencia continue Boolean_expression

Sentencias de control de flujoSentencias de control de flujoEjemplo de la instruccioacuten WhileEjemplo de la instruccioacuten While

Create Procedure prCalcFactorialCreate Procedure prCalcFactorial-- calculate factorial-- calculate factorial-- 1 = 1-- 1 = 1-- 3 = 3 2 1-- 3 = 3 2 1-- n = n (n-1) 5 4 3 2 1-- n = n (n-1) 5 4 3 2 1

N tinyintN tinyintF int OUTPUTF int OUTPUTAsAsSet F = 1Set F = 1while N gt 1while N gt 1beginbegin

set F = F Nset F = F NSet N = N - 1Set N = N - 1

endendreturn 0return 0

CursoresCursores

conjuntos de datosconjuntos de datos

Las aplicaciones de usuario estan Las aplicaciones de usuario estan desentildeadas para mostrar conjuntosdesentildeadas para mostrar conjuntos

de datos por registrosde datos por registros

Los cursores unen estos dos enfoquesLos cursores unen estos dos enfoques

Tenemos tres tipos de cursores en SQL Tenemos tres tipos de cursores en SQL ServerServer

ndash ndash Client cursorsClient cursors

ndash ndash API Server cursorsAPI Server cursors

ndash ndash Transact-SQL cursorsTransact-SQL cursors

CursoresCursoresTransact-SQL vs Resto de cursoresTransact-SQL vs Resto de cursores

La finalidad de los cursores es su La finalidad de los cursores es su principal diferenciaprincipal diferencia

1048698 1048698 Transact-SQL se utiliza enTransact-SQL se utiliza enndash ndash Los procedimientos almacenadosLos procedimientos almacenadosndash ndash Los procesos por lotesLos procesos por lotesndash ndash Las funcionesLas funcionesndash ndash Los disparadoresLos disparadores1048698 1048698 El resto de cursores se utilizan desde El resto de cursores se utilizan desde

las aplicaciones de loslas aplicaciones de losusuarios (normalmente en forma usuarios (normalmente en forma

embebida)embebida)

CursoresCursoresTransact-SQLTransact-SQL

1048698 1048698 Pasos a seguir en la definicioacuten de un cursor en un Pasos a seguir en la definicioacuten de un cursor en un procedimientoprocedimiento

almacenadoalmacenado1048698 1048698 1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1048698 1048698 2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor1048698 1048698 3 Utilizar la sentencia ldquoFetchrdquo para3 Utilizar la sentencia ldquoFetchrdquo para

ndash ndash recuperar los valores a los que apunta el cursorrecuperar los valores a los que apunta el cursorndash ndash cambiar la posicioacuten del puntero del cursorcambiar la posicioacuten del puntero del cursor

1048698 1048698 4 Ahora utilizamos los valores leidos para nuestros fines4 Ahora utilizamos los valores leidos para nuestros fines1048698 1048698 5 Si es necesario se repiten los pasos 3 y 45 Si es necesario se repiten los pasos 3 y 41048698 1048698 6 Cerramos el cursor para6 Cerramos el cursor para

ndash ndash desbloquear los datosdesbloquear los datosndash ndash liberar memorialiberar memoriandash ndash etcetc1048698 1048698 7 Eliminamos definitivamente el cursor7 Eliminamos definitivamente el cursor

Cursores EjemploCursores EjemploDefinimos los paraacutemetros y las variablesDefinimos los paraacutemetros y las variables

CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))AS AS BEGIN BEGIN

SET NOCOUNT OFF SET NOCOUNT OFF

DECLARE CAMPANA VARCHAR(20)DECLARE CAMPANA VARCHAR(20)DECLARE CODEJEC VARCHAR(10)DECLARE CODEJEC VARCHAR(10)DECLARE INDICE INTEGERDECLARE INDICE INTEGERDECLARE CORTIPOVTA CHAR(10)DECLARE CORTIPOVTA CHAR(10)

DECLARE ventas CURSOR FOR DECLARE ventas CURSOR FOR SELECT camp_tmk cod_agente indice2 cor_tipopersonaSELECT camp_tmk cod_agente indice2 cor_tipopersona FROM MON_VENTASEASIFROM MON_VENTASEASI WHERE fec_coti between FECHAINI and FECFINWHERE fec_coti between FECHAINI and FECFIN

AND cod_estado in (000PNDPRP)AND cod_estado in (000PNDPRP)

OPEN ventasOPEN ventas

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

ENDENDGOGO

Otro EjemploOtro Ejemplo

declare nombre varchar(50)declare direccion varchar(100)declare departamento_cursor cursor for

select nombre direccion from departamentoopen departamento_cursorfetch next from departamento_cursor into nombre direccionwhile fetch_status = 0begin

print(rsquoDepartamento de rsquo + nombre + rsquo Direcciacuteon rsquo + direccion)fetch next from departamento_cursor into nombre direccion

endclose departamento_cursordeallocate departamento_cursor

TriggersTriggers

No son mas que un caso particular deNo son mas que un caso particular deprocedimiento almacenadoprocedimiento almacenado1048698 1048698 No se pueden ejecutar directamenteNo se pueden ejecutar directamente1048698 1048698 Se ejecutan al realizarse alguna de Se ejecutan al realizarse alguna de

estasestasoperacionesoperacionesndash ndash Insercioacuten InsertInsercioacuten Insertndash ndash Modificacioacuten UpdateModificacioacuten Updatendash ndash Borrado DeleteBorrado Delete

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

Procedimientos de AlmacenadoProcedimientos de Almacenado

Para crear un procedimiento almacenado usamos createalmacenados en el DBMS

create procedure miprocedimiento parametro1 tipo1

asbeginend

Un procedimiento no tiene un valor de retorno pero puede producir resultado en la forma de una o varias consultas

Restricciones de Integridad

Hasta ahora los tipos de restricciones de integridad que hemosvisto usan un modelo estaacutetico dependen de valores constantesSon controladas cada vez que el elemento asociado cambia (en cualquier forma)Hemos usado

bull Restricciones de unicidad ndash llaves primariasbull Restricciones referenciales ndash llaves foracuteaneasbull Restricciones de dominio ndash formatos de strings rangos devalores etc

Las restricciones que hemos visto son impuestas por el disentildeador de la BD y ejecutadas por el DBMS

Sentencias de control de flujoSentencias de control de flujo

1048698 1048698 IfIf

1048698 1048698 WhileWhile

1048698 1048698 BreakBreak

1048698 1048698 ContinueContinue

1048698 1048698 GoToGoTo

1048698 1048698 WaitForWaitFor

Sentencias de control de flujoSentencias de control de flujoIFIF

1048698 1048698 Esta sentencia cambia el flujo de ejecucioacutenEsta sentencia cambia el flujo de ejecucioacuten1048698 1048698 If boolean_expressionIf boolean_expression1048698 1048698 Transact-SQL_statement | statement_block Transact-SQL_statement | statement_block1048698 1048698 [else[else1048698 1048698 Transact-SQL_statement | statement_block] Transact-SQL_statement | statement_block]1048698 1048698 El valor True=Cierto=Verdadero=1El valor True=Cierto=Verdadero=11048698 1048698 El valor False=Falso=0El valor False=Falso=01048698 1048698 Si el valor es cierto ejecuta el primer bloque de Si el valor es cierto ejecuta el primer bloque de

sentencias sino el segundosentencias sino el segundo

EjemploEjemplo WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

Sentencias de control de flujoSentencias de control de flujoIF con subconsultasIF con subconsultas

1048698 1048698 Otra forma de utilizar las consultasOtra forma de utilizar las consultas

1048698 1048698 If [NOT] Exists(subquery)If [NOT] Exists(subquery)

10486981048698 Transact-SQL_statement | Transact-SQL_statement | statement_blockstatement_block

1048698 1048698 [else[else

1048698 1048698 Transact-SQL_statement | Transact-SQL_statement | statement_block]statement_block]

Sentencias de control de flujoSentencias de control de flujoWhileWhile

While Boolean_expressionWhile Boolean_expressionsql_statement | statement_blocksql_statement | statement_block[Break][Break]sql_statement | statement_blocksql_statement | statement_block[Continue][Continue]sql_statement | statement_blocksql_statement | statement_blockResto de instruccionesResto de instrucciones

1048698 1048698 True = 1 False = 0True = 1 False = 01048698 1048698 Break El servidor interrumpe el bucle y salta a la siguienteBreak El servidor interrumpe el bucle y salta a la siguienteinstruccioacuten despueacutes del bucle Resto de instruccionesinstruccioacuten despueacutes del bucle Resto de instrucciones1048698 1048698 Continue El servidor vuelve inmediatamente a la guarda del Continue El servidor vuelve inmediatamente a la guarda del

buclebucleignorando el resto de instrucciones por ejecutar despueacutes de laignorando el resto de instrucciones por ejecutar despueacutes de lasentencia continue Boolean_expressionsentencia continue Boolean_expression

Sentencias de control de flujoSentencias de control de flujoEjemplo de la instruccioacuten WhileEjemplo de la instruccioacuten While

Create Procedure prCalcFactorialCreate Procedure prCalcFactorial-- calculate factorial-- calculate factorial-- 1 = 1-- 1 = 1-- 3 = 3 2 1-- 3 = 3 2 1-- n = n (n-1) 5 4 3 2 1-- n = n (n-1) 5 4 3 2 1

N tinyintN tinyintF int OUTPUTF int OUTPUTAsAsSet F = 1Set F = 1while N gt 1while N gt 1beginbegin

set F = F Nset F = F NSet N = N - 1Set N = N - 1

endendreturn 0return 0

CursoresCursores

conjuntos de datosconjuntos de datos

Las aplicaciones de usuario estan Las aplicaciones de usuario estan desentildeadas para mostrar conjuntosdesentildeadas para mostrar conjuntos

de datos por registrosde datos por registros

Los cursores unen estos dos enfoquesLos cursores unen estos dos enfoques

Tenemos tres tipos de cursores en SQL Tenemos tres tipos de cursores en SQL ServerServer

ndash ndash Client cursorsClient cursors

ndash ndash API Server cursorsAPI Server cursors

ndash ndash Transact-SQL cursorsTransact-SQL cursors

CursoresCursoresTransact-SQL vs Resto de cursoresTransact-SQL vs Resto de cursores

La finalidad de los cursores es su La finalidad de los cursores es su principal diferenciaprincipal diferencia

1048698 1048698 Transact-SQL se utiliza enTransact-SQL se utiliza enndash ndash Los procedimientos almacenadosLos procedimientos almacenadosndash ndash Los procesos por lotesLos procesos por lotesndash ndash Las funcionesLas funcionesndash ndash Los disparadoresLos disparadores1048698 1048698 El resto de cursores se utilizan desde El resto de cursores se utilizan desde

las aplicaciones de loslas aplicaciones de losusuarios (normalmente en forma usuarios (normalmente en forma

embebida)embebida)

CursoresCursoresTransact-SQLTransact-SQL

1048698 1048698 Pasos a seguir en la definicioacuten de un cursor en un Pasos a seguir en la definicioacuten de un cursor en un procedimientoprocedimiento

almacenadoalmacenado1048698 1048698 1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1048698 1048698 2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor1048698 1048698 3 Utilizar la sentencia ldquoFetchrdquo para3 Utilizar la sentencia ldquoFetchrdquo para

ndash ndash recuperar los valores a los que apunta el cursorrecuperar los valores a los que apunta el cursorndash ndash cambiar la posicioacuten del puntero del cursorcambiar la posicioacuten del puntero del cursor

1048698 1048698 4 Ahora utilizamos los valores leidos para nuestros fines4 Ahora utilizamos los valores leidos para nuestros fines1048698 1048698 5 Si es necesario se repiten los pasos 3 y 45 Si es necesario se repiten los pasos 3 y 41048698 1048698 6 Cerramos el cursor para6 Cerramos el cursor para

ndash ndash desbloquear los datosdesbloquear los datosndash ndash liberar memorialiberar memoriandash ndash etcetc1048698 1048698 7 Eliminamos definitivamente el cursor7 Eliminamos definitivamente el cursor

Cursores EjemploCursores EjemploDefinimos los paraacutemetros y las variablesDefinimos los paraacutemetros y las variables

CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))AS AS BEGIN BEGIN

SET NOCOUNT OFF SET NOCOUNT OFF

DECLARE CAMPANA VARCHAR(20)DECLARE CAMPANA VARCHAR(20)DECLARE CODEJEC VARCHAR(10)DECLARE CODEJEC VARCHAR(10)DECLARE INDICE INTEGERDECLARE INDICE INTEGERDECLARE CORTIPOVTA CHAR(10)DECLARE CORTIPOVTA CHAR(10)

DECLARE ventas CURSOR FOR DECLARE ventas CURSOR FOR SELECT camp_tmk cod_agente indice2 cor_tipopersonaSELECT camp_tmk cod_agente indice2 cor_tipopersona FROM MON_VENTASEASIFROM MON_VENTASEASI WHERE fec_coti between FECHAINI and FECFINWHERE fec_coti between FECHAINI and FECFIN

AND cod_estado in (000PNDPRP)AND cod_estado in (000PNDPRP)

OPEN ventasOPEN ventas

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

ENDENDGOGO

Otro EjemploOtro Ejemplo

declare nombre varchar(50)declare direccion varchar(100)declare departamento_cursor cursor for

select nombre direccion from departamentoopen departamento_cursorfetch next from departamento_cursor into nombre direccionwhile fetch_status = 0begin

print(rsquoDepartamento de rsquo + nombre + rsquo Direcciacuteon rsquo + direccion)fetch next from departamento_cursor into nombre direccion

endclose departamento_cursordeallocate departamento_cursor

TriggersTriggers

No son mas que un caso particular deNo son mas que un caso particular deprocedimiento almacenadoprocedimiento almacenado1048698 1048698 No se pueden ejecutar directamenteNo se pueden ejecutar directamente1048698 1048698 Se ejecutan al realizarse alguna de Se ejecutan al realizarse alguna de

estasestasoperacionesoperacionesndash ndash Insercioacuten InsertInsercioacuten Insertndash ndash Modificacioacuten UpdateModificacioacuten Updatendash ndash Borrado DeleteBorrado Delete

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

Restricciones de Integridad

Hasta ahora los tipos de restricciones de integridad que hemosvisto usan un modelo estaacutetico dependen de valores constantesSon controladas cada vez que el elemento asociado cambia (en cualquier forma)Hemos usado

bull Restricciones de unicidad ndash llaves primariasbull Restricciones referenciales ndash llaves foracuteaneasbull Restricciones de dominio ndash formatos de strings rangos devalores etc

Las restricciones que hemos visto son impuestas por el disentildeador de la BD y ejecutadas por el DBMS

Sentencias de control de flujoSentencias de control de flujo

1048698 1048698 IfIf

1048698 1048698 WhileWhile

1048698 1048698 BreakBreak

1048698 1048698 ContinueContinue

1048698 1048698 GoToGoTo

1048698 1048698 WaitForWaitFor

Sentencias de control de flujoSentencias de control de flujoIFIF

1048698 1048698 Esta sentencia cambia el flujo de ejecucioacutenEsta sentencia cambia el flujo de ejecucioacuten1048698 1048698 If boolean_expressionIf boolean_expression1048698 1048698 Transact-SQL_statement | statement_block Transact-SQL_statement | statement_block1048698 1048698 [else[else1048698 1048698 Transact-SQL_statement | statement_block] Transact-SQL_statement | statement_block]1048698 1048698 El valor True=Cierto=Verdadero=1El valor True=Cierto=Verdadero=11048698 1048698 El valor False=Falso=0El valor False=Falso=01048698 1048698 Si el valor es cierto ejecuta el primer bloque de Si el valor es cierto ejecuta el primer bloque de

sentencias sino el segundosentencias sino el segundo

EjemploEjemplo WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

Sentencias de control de flujoSentencias de control de flujoIF con subconsultasIF con subconsultas

1048698 1048698 Otra forma de utilizar las consultasOtra forma de utilizar las consultas

1048698 1048698 If [NOT] Exists(subquery)If [NOT] Exists(subquery)

10486981048698 Transact-SQL_statement | Transact-SQL_statement | statement_blockstatement_block

1048698 1048698 [else[else

1048698 1048698 Transact-SQL_statement | Transact-SQL_statement | statement_block]statement_block]

Sentencias de control de flujoSentencias de control de flujoWhileWhile

While Boolean_expressionWhile Boolean_expressionsql_statement | statement_blocksql_statement | statement_block[Break][Break]sql_statement | statement_blocksql_statement | statement_block[Continue][Continue]sql_statement | statement_blocksql_statement | statement_blockResto de instruccionesResto de instrucciones

1048698 1048698 True = 1 False = 0True = 1 False = 01048698 1048698 Break El servidor interrumpe el bucle y salta a la siguienteBreak El servidor interrumpe el bucle y salta a la siguienteinstruccioacuten despueacutes del bucle Resto de instruccionesinstruccioacuten despueacutes del bucle Resto de instrucciones1048698 1048698 Continue El servidor vuelve inmediatamente a la guarda del Continue El servidor vuelve inmediatamente a la guarda del

buclebucleignorando el resto de instrucciones por ejecutar despueacutes de laignorando el resto de instrucciones por ejecutar despueacutes de lasentencia continue Boolean_expressionsentencia continue Boolean_expression

Sentencias de control de flujoSentencias de control de flujoEjemplo de la instruccioacuten WhileEjemplo de la instruccioacuten While

Create Procedure prCalcFactorialCreate Procedure prCalcFactorial-- calculate factorial-- calculate factorial-- 1 = 1-- 1 = 1-- 3 = 3 2 1-- 3 = 3 2 1-- n = n (n-1) 5 4 3 2 1-- n = n (n-1) 5 4 3 2 1

N tinyintN tinyintF int OUTPUTF int OUTPUTAsAsSet F = 1Set F = 1while N gt 1while N gt 1beginbegin

set F = F Nset F = F NSet N = N - 1Set N = N - 1

endendreturn 0return 0

CursoresCursores

conjuntos de datosconjuntos de datos

Las aplicaciones de usuario estan Las aplicaciones de usuario estan desentildeadas para mostrar conjuntosdesentildeadas para mostrar conjuntos

de datos por registrosde datos por registros

Los cursores unen estos dos enfoquesLos cursores unen estos dos enfoques

Tenemos tres tipos de cursores en SQL Tenemos tres tipos de cursores en SQL ServerServer

ndash ndash Client cursorsClient cursors

ndash ndash API Server cursorsAPI Server cursors

ndash ndash Transact-SQL cursorsTransact-SQL cursors

CursoresCursoresTransact-SQL vs Resto de cursoresTransact-SQL vs Resto de cursores

La finalidad de los cursores es su La finalidad de los cursores es su principal diferenciaprincipal diferencia

1048698 1048698 Transact-SQL se utiliza enTransact-SQL se utiliza enndash ndash Los procedimientos almacenadosLos procedimientos almacenadosndash ndash Los procesos por lotesLos procesos por lotesndash ndash Las funcionesLas funcionesndash ndash Los disparadoresLos disparadores1048698 1048698 El resto de cursores se utilizan desde El resto de cursores se utilizan desde

las aplicaciones de loslas aplicaciones de losusuarios (normalmente en forma usuarios (normalmente en forma

embebida)embebida)

CursoresCursoresTransact-SQLTransact-SQL

1048698 1048698 Pasos a seguir en la definicioacuten de un cursor en un Pasos a seguir en la definicioacuten de un cursor en un procedimientoprocedimiento

almacenadoalmacenado1048698 1048698 1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1048698 1048698 2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor1048698 1048698 3 Utilizar la sentencia ldquoFetchrdquo para3 Utilizar la sentencia ldquoFetchrdquo para

ndash ndash recuperar los valores a los que apunta el cursorrecuperar los valores a los que apunta el cursorndash ndash cambiar la posicioacuten del puntero del cursorcambiar la posicioacuten del puntero del cursor

1048698 1048698 4 Ahora utilizamos los valores leidos para nuestros fines4 Ahora utilizamos los valores leidos para nuestros fines1048698 1048698 5 Si es necesario se repiten los pasos 3 y 45 Si es necesario se repiten los pasos 3 y 41048698 1048698 6 Cerramos el cursor para6 Cerramos el cursor para

ndash ndash desbloquear los datosdesbloquear los datosndash ndash liberar memorialiberar memoriandash ndash etcetc1048698 1048698 7 Eliminamos definitivamente el cursor7 Eliminamos definitivamente el cursor

Cursores EjemploCursores EjemploDefinimos los paraacutemetros y las variablesDefinimos los paraacutemetros y las variables

CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))AS AS BEGIN BEGIN

SET NOCOUNT OFF SET NOCOUNT OFF

DECLARE CAMPANA VARCHAR(20)DECLARE CAMPANA VARCHAR(20)DECLARE CODEJEC VARCHAR(10)DECLARE CODEJEC VARCHAR(10)DECLARE INDICE INTEGERDECLARE INDICE INTEGERDECLARE CORTIPOVTA CHAR(10)DECLARE CORTIPOVTA CHAR(10)

DECLARE ventas CURSOR FOR DECLARE ventas CURSOR FOR SELECT camp_tmk cod_agente indice2 cor_tipopersonaSELECT camp_tmk cod_agente indice2 cor_tipopersona FROM MON_VENTASEASIFROM MON_VENTASEASI WHERE fec_coti between FECHAINI and FECFINWHERE fec_coti between FECHAINI and FECFIN

AND cod_estado in (000PNDPRP)AND cod_estado in (000PNDPRP)

OPEN ventasOPEN ventas

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

ENDENDGOGO

Otro EjemploOtro Ejemplo

declare nombre varchar(50)declare direccion varchar(100)declare departamento_cursor cursor for

select nombre direccion from departamentoopen departamento_cursorfetch next from departamento_cursor into nombre direccionwhile fetch_status = 0begin

print(rsquoDepartamento de rsquo + nombre + rsquo Direcciacuteon rsquo + direccion)fetch next from departamento_cursor into nombre direccion

endclose departamento_cursordeallocate departamento_cursor

TriggersTriggers

No son mas que un caso particular deNo son mas que un caso particular deprocedimiento almacenadoprocedimiento almacenado1048698 1048698 No se pueden ejecutar directamenteNo se pueden ejecutar directamente1048698 1048698 Se ejecutan al realizarse alguna de Se ejecutan al realizarse alguna de

estasestasoperacionesoperacionesndash ndash Insercioacuten InsertInsercioacuten Insertndash ndash Modificacioacuten UpdateModificacioacuten Updatendash ndash Borrado DeleteBorrado Delete

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

Sentencias de control de flujoSentencias de control de flujo

1048698 1048698 IfIf

1048698 1048698 WhileWhile

1048698 1048698 BreakBreak

1048698 1048698 ContinueContinue

1048698 1048698 GoToGoTo

1048698 1048698 WaitForWaitFor

Sentencias de control de flujoSentencias de control de flujoIFIF

1048698 1048698 Esta sentencia cambia el flujo de ejecucioacutenEsta sentencia cambia el flujo de ejecucioacuten1048698 1048698 If boolean_expressionIf boolean_expression1048698 1048698 Transact-SQL_statement | statement_block Transact-SQL_statement | statement_block1048698 1048698 [else[else1048698 1048698 Transact-SQL_statement | statement_block] Transact-SQL_statement | statement_block]1048698 1048698 El valor True=Cierto=Verdadero=1El valor True=Cierto=Verdadero=11048698 1048698 El valor False=Falso=0El valor False=Falso=01048698 1048698 Si el valor es cierto ejecuta el primer bloque de Si el valor es cierto ejecuta el primer bloque de

sentencias sino el segundosentencias sino el segundo

EjemploEjemplo WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

Sentencias de control de flujoSentencias de control de flujoIF con subconsultasIF con subconsultas

1048698 1048698 Otra forma de utilizar las consultasOtra forma de utilizar las consultas

1048698 1048698 If [NOT] Exists(subquery)If [NOT] Exists(subquery)

10486981048698 Transact-SQL_statement | Transact-SQL_statement | statement_blockstatement_block

1048698 1048698 [else[else

1048698 1048698 Transact-SQL_statement | Transact-SQL_statement | statement_block]statement_block]

Sentencias de control de flujoSentencias de control de flujoWhileWhile

While Boolean_expressionWhile Boolean_expressionsql_statement | statement_blocksql_statement | statement_block[Break][Break]sql_statement | statement_blocksql_statement | statement_block[Continue][Continue]sql_statement | statement_blocksql_statement | statement_blockResto de instruccionesResto de instrucciones

1048698 1048698 True = 1 False = 0True = 1 False = 01048698 1048698 Break El servidor interrumpe el bucle y salta a la siguienteBreak El servidor interrumpe el bucle y salta a la siguienteinstruccioacuten despueacutes del bucle Resto de instruccionesinstruccioacuten despueacutes del bucle Resto de instrucciones1048698 1048698 Continue El servidor vuelve inmediatamente a la guarda del Continue El servidor vuelve inmediatamente a la guarda del

buclebucleignorando el resto de instrucciones por ejecutar despueacutes de laignorando el resto de instrucciones por ejecutar despueacutes de lasentencia continue Boolean_expressionsentencia continue Boolean_expression

Sentencias de control de flujoSentencias de control de flujoEjemplo de la instruccioacuten WhileEjemplo de la instruccioacuten While

Create Procedure prCalcFactorialCreate Procedure prCalcFactorial-- calculate factorial-- calculate factorial-- 1 = 1-- 1 = 1-- 3 = 3 2 1-- 3 = 3 2 1-- n = n (n-1) 5 4 3 2 1-- n = n (n-1) 5 4 3 2 1

N tinyintN tinyintF int OUTPUTF int OUTPUTAsAsSet F = 1Set F = 1while N gt 1while N gt 1beginbegin

set F = F Nset F = F NSet N = N - 1Set N = N - 1

endendreturn 0return 0

CursoresCursores

conjuntos de datosconjuntos de datos

Las aplicaciones de usuario estan Las aplicaciones de usuario estan desentildeadas para mostrar conjuntosdesentildeadas para mostrar conjuntos

de datos por registrosde datos por registros

Los cursores unen estos dos enfoquesLos cursores unen estos dos enfoques

Tenemos tres tipos de cursores en SQL Tenemos tres tipos de cursores en SQL ServerServer

ndash ndash Client cursorsClient cursors

ndash ndash API Server cursorsAPI Server cursors

ndash ndash Transact-SQL cursorsTransact-SQL cursors

CursoresCursoresTransact-SQL vs Resto de cursoresTransact-SQL vs Resto de cursores

La finalidad de los cursores es su La finalidad de los cursores es su principal diferenciaprincipal diferencia

1048698 1048698 Transact-SQL se utiliza enTransact-SQL se utiliza enndash ndash Los procedimientos almacenadosLos procedimientos almacenadosndash ndash Los procesos por lotesLos procesos por lotesndash ndash Las funcionesLas funcionesndash ndash Los disparadoresLos disparadores1048698 1048698 El resto de cursores se utilizan desde El resto de cursores se utilizan desde

las aplicaciones de loslas aplicaciones de losusuarios (normalmente en forma usuarios (normalmente en forma

embebida)embebida)

CursoresCursoresTransact-SQLTransact-SQL

1048698 1048698 Pasos a seguir en la definicioacuten de un cursor en un Pasos a seguir en la definicioacuten de un cursor en un procedimientoprocedimiento

almacenadoalmacenado1048698 1048698 1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1048698 1048698 2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor1048698 1048698 3 Utilizar la sentencia ldquoFetchrdquo para3 Utilizar la sentencia ldquoFetchrdquo para

ndash ndash recuperar los valores a los que apunta el cursorrecuperar los valores a los que apunta el cursorndash ndash cambiar la posicioacuten del puntero del cursorcambiar la posicioacuten del puntero del cursor

1048698 1048698 4 Ahora utilizamos los valores leidos para nuestros fines4 Ahora utilizamos los valores leidos para nuestros fines1048698 1048698 5 Si es necesario se repiten los pasos 3 y 45 Si es necesario se repiten los pasos 3 y 41048698 1048698 6 Cerramos el cursor para6 Cerramos el cursor para

ndash ndash desbloquear los datosdesbloquear los datosndash ndash liberar memorialiberar memoriandash ndash etcetc1048698 1048698 7 Eliminamos definitivamente el cursor7 Eliminamos definitivamente el cursor

Cursores EjemploCursores EjemploDefinimos los paraacutemetros y las variablesDefinimos los paraacutemetros y las variables

CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))AS AS BEGIN BEGIN

SET NOCOUNT OFF SET NOCOUNT OFF

DECLARE CAMPANA VARCHAR(20)DECLARE CAMPANA VARCHAR(20)DECLARE CODEJEC VARCHAR(10)DECLARE CODEJEC VARCHAR(10)DECLARE INDICE INTEGERDECLARE INDICE INTEGERDECLARE CORTIPOVTA CHAR(10)DECLARE CORTIPOVTA CHAR(10)

DECLARE ventas CURSOR FOR DECLARE ventas CURSOR FOR SELECT camp_tmk cod_agente indice2 cor_tipopersonaSELECT camp_tmk cod_agente indice2 cor_tipopersona FROM MON_VENTASEASIFROM MON_VENTASEASI WHERE fec_coti between FECHAINI and FECFINWHERE fec_coti between FECHAINI and FECFIN

AND cod_estado in (000PNDPRP)AND cod_estado in (000PNDPRP)

OPEN ventasOPEN ventas

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

ENDENDGOGO

Otro EjemploOtro Ejemplo

declare nombre varchar(50)declare direccion varchar(100)declare departamento_cursor cursor for

select nombre direccion from departamentoopen departamento_cursorfetch next from departamento_cursor into nombre direccionwhile fetch_status = 0begin

print(rsquoDepartamento de rsquo + nombre + rsquo Direcciacuteon rsquo + direccion)fetch next from departamento_cursor into nombre direccion

endclose departamento_cursordeallocate departamento_cursor

TriggersTriggers

No son mas que un caso particular deNo son mas que un caso particular deprocedimiento almacenadoprocedimiento almacenado1048698 1048698 No se pueden ejecutar directamenteNo se pueden ejecutar directamente1048698 1048698 Se ejecutan al realizarse alguna de Se ejecutan al realizarse alguna de

estasestasoperacionesoperacionesndash ndash Insercioacuten InsertInsercioacuten Insertndash ndash Modificacioacuten UpdateModificacioacuten Updatendash ndash Borrado DeleteBorrado Delete

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

Sentencias de control de flujoSentencias de control de flujoIFIF

1048698 1048698 Esta sentencia cambia el flujo de ejecucioacutenEsta sentencia cambia el flujo de ejecucioacuten1048698 1048698 If boolean_expressionIf boolean_expression1048698 1048698 Transact-SQL_statement | statement_block Transact-SQL_statement | statement_block1048698 1048698 [else[else1048698 1048698 Transact-SQL_statement | statement_block] Transact-SQL_statement | statement_block]1048698 1048698 El valor True=Cierto=Verdadero=1El valor True=Cierto=Verdadero=11048698 1048698 El valor False=Falso=0El valor False=Falso=01048698 1048698 Si el valor es cierto ejecuta el primer bloque de Si el valor es cierto ejecuta el primer bloque de

sentencias sino el segundosentencias sino el segundo

EjemploEjemplo WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

Sentencias de control de flujoSentencias de control de flujoIF con subconsultasIF con subconsultas

1048698 1048698 Otra forma de utilizar las consultasOtra forma de utilizar las consultas

1048698 1048698 If [NOT] Exists(subquery)If [NOT] Exists(subquery)

10486981048698 Transact-SQL_statement | Transact-SQL_statement | statement_blockstatement_block

1048698 1048698 [else[else

1048698 1048698 Transact-SQL_statement | Transact-SQL_statement | statement_block]statement_block]

Sentencias de control de flujoSentencias de control de flujoWhileWhile

While Boolean_expressionWhile Boolean_expressionsql_statement | statement_blocksql_statement | statement_block[Break][Break]sql_statement | statement_blocksql_statement | statement_block[Continue][Continue]sql_statement | statement_blocksql_statement | statement_blockResto de instruccionesResto de instrucciones

1048698 1048698 True = 1 False = 0True = 1 False = 01048698 1048698 Break El servidor interrumpe el bucle y salta a la siguienteBreak El servidor interrumpe el bucle y salta a la siguienteinstruccioacuten despueacutes del bucle Resto de instruccionesinstruccioacuten despueacutes del bucle Resto de instrucciones1048698 1048698 Continue El servidor vuelve inmediatamente a la guarda del Continue El servidor vuelve inmediatamente a la guarda del

buclebucleignorando el resto de instrucciones por ejecutar despueacutes de laignorando el resto de instrucciones por ejecutar despueacutes de lasentencia continue Boolean_expressionsentencia continue Boolean_expression

Sentencias de control de flujoSentencias de control de flujoEjemplo de la instruccioacuten WhileEjemplo de la instruccioacuten While

Create Procedure prCalcFactorialCreate Procedure prCalcFactorial-- calculate factorial-- calculate factorial-- 1 = 1-- 1 = 1-- 3 = 3 2 1-- 3 = 3 2 1-- n = n (n-1) 5 4 3 2 1-- n = n (n-1) 5 4 3 2 1

N tinyintN tinyintF int OUTPUTF int OUTPUTAsAsSet F = 1Set F = 1while N gt 1while N gt 1beginbegin

set F = F Nset F = F NSet N = N - 1Set N = N - 1

endendreturn 0return 0

CursoresCursores

conjuntos de datosconjuntos de datos

Las aplicaciones de usuario estan Las aplicaciones de usuario estan desentildeadas para mostrar conjuntosdesentildeadas para mostrar conjuntos

de datos por registrosde datos por registros

Los cursores unen estos dos enfoquesLos cursores unen estos dos enfoques

Tenemos tres tipos de cursores en SQL Tenemos tres tipos de cursores en SQL ServerServer

ndash ndash Client cursorsClient cursors

ndash ndash API Server cursorsAPI Server cursors

ndash ndash Transact-SQL cursorsTransact-SQL cursors

CursoresCursoresTransact-SQL vs Resto de cursoresTransact-SQL vs Resto de cursores

La finalidad de los cursores es su La finalidad de los cursores es su principal diferenciaprincipal diferencia

1048698 1048698 Transact-SQL se utiliza enTransact-SQL se utiliza enndash ndash Los procedimientos almacenadosLos procedimientos almacenadosndash ndash Los procesos por lotesLos procesos por lotesndash ndash Las funcionesLas funcionesndash ndash Los disparadoresLos disparadores1048698 1048698 El resto de cursores se utilizan desde El resto de cursores se utilizan desde

las aplicaciones de loslas aplicaciones de losusuarios (normalmente en forma usuarios (normalmente en forma

embebida)embebida)

CursoresCursoresTransact-SQLTransact-SQL

1048698 1048698 Pasos a seguir en la definicioacuten de un cursor en un Pasos a seguir en la definicioacuten de un cursor en un procedimientoprocedimiento

almacenadoalmacenado1048698 1048698 1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1048698 1048698 2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor1048698 1048698 3 Utilizar la sentencia ldquoFetchrdquo para3 Utilizar la sentencia ldquoFetchrdquo para

ndash ndash recuperar los valores a los que apunta el cursorrecuperar los valores a los que apunta el cursorndash ndash cambiar la posicioacuten del puntero del cursorcambiar la posicioacuten del puntero del cursor

1048698 1048698 4 Ahora utilizamos los valores leidos para nuestros fines4 Ahora utilizamos los valores leidos para nuestros fines1048698 1048698 5 Si es necesario se repiten los pasos 3 y 45 Si es necesario se repiten los pasos 3 y 41048698 1048698 6 Cerramos el cursor para6 Cerramos el cursor para

ndash ndash desbloquear los datosdesbloquear los datosndash ndash liberar memorialiberar memoriandash ndash etcetc1048698 1048698 7 Eliminamos definitivamente el cursor7 Eliminamos definitivamente el cursor

Cursores EjemploCursores EjemploDefinimos los paraacutemetros y las variablesDefinimos los paraacutemetros y las variables

CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))AS AS BEGIN BEGIN

SET NOCOUNT OFF SET NOCOUNT OFF

DECLARE CAMPANA VARCHAR(20)DECLARE CAMPANA VARCHAR(20)DECLARE CODEJEC VARCHAR(10)DECLARE CODEJEC VARCHAR(10)DECLARE INDICE INTEGERDECLARE INDICE INTEGERDECLARE CORTIPOVTA CHAR(10)DECLARE CORTIPOVTA CHAR(10)

DECLARE ventas CURSOR FOR DECLARE ventas CURSOR FOR SELECT camp_tmk cod_agente indice2 cor_tipopersonaSELECT camp_tmk cod_agente indice2 cor_tipopersona FROM MON_VENTASEASIFROM MON_VENTASEASI WHERE fec_coti between FECHAINI and FECFINWHERE fec_coti between FECHAINI and FECFIN

AND cod_estado in (000PNDPRP)AND cod_estado in (000PNDPRP)

OPEN ventasOPEN ventas

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

ENDENDGOGO

Otro EjemploOtro Ejemplo

declare nombre varchar(50)declare direccion varchar(100)declare departamento_cursor cursor for

select nombre direccion from departamentoopen departamento_cursorfetch next from departamento_cursor into nombre direccionwhile fetch_status = 0begin

print(rsquoDepartamento de rsquo + nombre + rsquo Direcciacuteon rsquo + direccion)fetch next from departamento_cursor into nombre direccion

endclose departamento_cursordeallocate departamento_cursor

TriggersTriggers

No son mas que un caso particular deNo son mas que un caso particular deprocedimiento almacenadoprocedimiento almacenado1048698 1048698 No se pueden ejecutar directamenteNo se pueden ejecutar directamente1048698 1048698 Se ejecutan al realizarse alguna de Se ejecutan al realizarse alguna de

estasestasoperacionesoperacionesndash ndash Insercioacuten InsertInsercioacuten Insertndash ndash Modificacioacuten UpdateModificacioacuten Updatendash ndash Borrado DeleteBorrado Delete

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

EjemploEjemplo WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

Sentencias de control de flujoSentencias de control de flujoIF con subconsultasIF con subconsultas

1048698 1048698 Otra forma de utilizar las consultasOtra forma de utilizar las consultas

1048698 1048698 If [NOT] Exists(subquery)If [NOT] Exists(subquery)

10486981048698 Transact-SQL_statement | Transact-SQL_statement | statement_blockstatement_block

1048698 1048698 [else[else

1048698 1048698 Transact-SQL_statement | Transact-SQL_statement | statement_block]statement_block]

Sentencias de control de flujoSentencias de control de flujoWhileWhile

While Boolean_expressionWhile Boolean_expressionsql_statement | statement_blocksql_statement | statement_block[Break][Break]sql_statement | statement_blocksql_statement | statement_block[Continue][Continue]sql_statement | statement_blocksql_statement | statement_blockResto de instruccionesResto de instrucciones

1048698 1048698 True = 1 False = 0True = 1 False = 01048698 1048698 Break El servidor interrumpe el bucle y salta a la siguienteBreak El servidor interrumpe el bucle y salta a la siguienteinstruccioacuten despueacutes del bucle Resto de instruccionesinstruccioacuten despueacutes del bucle Resto de instrucciones1048698 1048698 Continue El servidor vuelve inmediatamente a la guarda del Continue El servidor vuelve inmediatamente a la guarda del

buclebucleignorando el resto de instrucciones por ejecutar despueacutes de laignorando el resto de instrucciones por ejecutar despueacutes de lasentencia continue Boolean_expressionsentencia continue Boolean_expression

Sentencias de control de flujoSentencias de control de flujoEjemplo de la instruccioacuten WhileEjemplo de la instruccioacuten While

Create Procedure prCalcFactorialCreate Procedure prCalcFactorial-- calculate factorial-- calculate factorial-- 1 = 1-- 1 = 1-- 3 = 3 2 1-- 3 = 3 2 1-- n = n (n-1) 5 4 3 2 1-- n = n (n-1) 5 4 3 2 1

N tinyintN tinyintF int OUTPUTF int OUTPUTAsAsSet F = 1Set F = 1while N gt 1while N gt 1beginbegin

set F = F Nset F = F NSet N = N - 1Set N = N - 1

endendreturn 0return 0

CursoresCursores

conjuntos de datosconjuntos de datos

Las aplicaciones de usuario estan Las aplicaciones de usuario estan desentildeadas para mostrar conjuntosdesentildeadas para mostrar conjuntos

de datos por registrosde datos por registros

Los cursores unen estos dos enfoquesLos cursores unen estos dos enfoques

Tenemos tres tipos de cursores en SQL Tenemos tres tipos de cursores en SQL ServerServer

ndash ndash Client cursorsClient cursors

ndash ndash API Server cursorsAPI Server cursors

ndash ndash Transact-SQL cursorsTransact-SQL cursors

CursoresCursoresTransact-SQL vs Resto de cursoresTransact-SQL vs Resto de cursores

La finalidad de los cursores es su La finalidad de los cursores es su principal diferenciaprincipal diferencia

1048698 1048698 Transact-SQL se utiliza enTransact-SQL se utiliza enndash ndash Los procedimientos almacenadosLos procedimientos almacenadosndash ndash Los procesos por lotesLos procesos por lotesndash ndash Las funcionesLas funcionesndash ndash Los disparadoresLos disparadores1048698 1048698 El resto de cursores se utilizan desde El resto de cursores se utilizan desde

las aplicaciones de loslas aplicaciones de losusuarios (normalmente en forma usuarios (normalmente en forma

embebida)embebida)

CursoresCursoresTransact-SQLTransact-SQL

1048698 1048698 Pasos a seguir en la definicioacuten de un cursor en un Pasos a seguir en la definicioacuten de un cursor en un procedimientoprocedimiento

almacenadoalmacenado1048698 1048698 1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1048698 1048698 2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor1048698 1048698 3 Utilizar la sentencia ldquoFetchrdquo para3 Utilizar la sentencia ldquoFetchrdquo para

ndash ndash recuperar los valores a los que apunta el cursorrecuperar los valores a los que apunta el cursorndash ndash cambiar la posicioacuten del puntero del cursorcambiar la posicioacuten del puntero del cursor

1048698 1048698 4 Ahora utilizamos los valores leidos para nuestros fines4 Ahora utilizamos los valores leidos para nuestros fines1048698 1048698 5 Si es necesario se repiten los pasos 3 y 45 Si es necesario se repiten los pasos 3 y 41048698 1048698 6 Cerramos el cursor para6 Cerramos el cursor para

ndash ndash desbloquear los datosdesbloquear los datosndash ndash liberar memorialiberar memoriandash ndash etcetc1048698 1048698 7 Eliminamos definitivamente el cursor7 Eliminamos definitivamente el cursor

Cursores EjemploCursores EjemploDefinimos los paraacutemetros y las variablesDefinimos los paraacutemetros y las variables

CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))AS AS BEGIN BEGIN

SET NOCOUNT OFF SET NOCOUNT OFF

DECLARE CAMPANA VARCHAR(20)DECLARE CAMPANA VARCHAR(20)DECLARE CODEJEC VARCHAR(10)DECLARE CODEJEC VARCHAR(10)DECLARE INDICE INTEGERDECLARE INDICE INTEGERDECLARE CORTIPOVTA CHAR(10)DECLARE CORTIPOVTA CHAR(10)

DECLARE ventas CURSOR FOR DECLARE ventas CURSOR FOR SELECT camp_tmk cod_agente indice2 cor_tipopersonaSELECT camp_tmk cod_agente indice2 cor_tipopersona FROM MON_VENTASEASIFROM MON_VENTASEASI WHERE fec_coti between FECHAINI and FECFINWHERE fec_coti between FECHAINI and FECFIN

AND cod_estado in (000PNDPRP)AND cod_estado in (000PNDPRP)

OPEN ventasOPEN ventas

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

ENDENDGOGO

Otro EjemploOtro Ejemplo

declare nombre varchar(50)declare direccion varchar(100)declare departamento_cursor cursor for

select nombre direccion from departamentoopen departamento_cursorfetch next from departamento_cursor into nombre direccionwhile fetch_status = 0begin

print(rsquoDepartamento de rsquo + nombre + rsquo Direcciacuteon rsquo + direccion)fetch next from departamento_cursor into nombre direccion

endclose departamento_cursordeallocate departamento_cursor

TriggersTriggers

No son mas que un caso particular deNo son mas que un caso particular deprocedimiento almacenadoprocedimiento almacenado1048698 1048698 No se pueden ejecutar directamenteNo se pueden ejecutar directamente1048698 1048698 Se ejecutan al realizarse alguna de Se ejecutan al realizarse alguna de

estasestasoperacionesoperacionesndash ndash Insercioacuten InsertInsercioacuten Insertndash ndash Modificacioacuten UpdateModificacioacuten Updatendash ndash Borrado DeleteBorrado Delete

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

Sentencias de control de flujoSentencias de control de flujoIF con subconsultasIF con subconsultas

1048698 1048698 Otra forma de utilizar las consultasOtra forma de utilizar las consultas

1048698 1048698 If [NOT] Exists(subquery)If [NOT] Exists(subquery)

10486981048698 Transact-SQL_statement | Transact-SQL_statement | statement_blockstatement_block

1048698 1048698 [else[else

1048698 1048698 Transact-SQL_statement | Transact-SQL_statement | statement_block]statement_block]

Sentencias de control de flujoSentencias de control de flujoWhileWhile

While Boolean_expressionWhile Boolean_expressionsql_statement | statement_blocksql_statement | statement_block[Break][Break]sql_statement | statement_blocksql_statement | statement_block[Continue][Continue]sql_statement | statement_blocksql_statement | statement_blockResto de instruccionesResto de instrucciones

1048698 1048698 True = 1 False = 0True = 1 False = 01048698 1048698 Break El servidor interrumpe el bucle y salta a la siguienteBreak El servidor interrumpe el bucle y salta a la siguienteinstruccioacuten despueacutes del bucle Resto de instruccionesinstruccioacuten despueacutes del bucle Resto de instrucciones1048698 1048698 Continue El servidor vuelve inmediatamente a la guarda del Continue El servidor vuelve inmediatamente a la guarda del

buclebucleignorando el resto de instrucciones por ejecutar despueacutes de laignorando el resto de instrucciones por ejecutar despueacutes de lasentencia continue Boolean_expressionsentencia continue Boolean_expression

Sentencias de control de flujoSentencias de control de flujoEjemplo de la instruccioacuten WhileEjemplo de la instruccioacuten While

Create Procedure prCalcFactorialCreate Procedure prCalcFactorial-- calculate factorial-- calculate factorial-- 1 = 1-- 1 = 1-- 3 = 3 2 1-- 3 = 3 2 1-- n = n (n-1) 5 4 3 2 1-- n = n (n-1) 5 4 3 2 1

N tinyintN tinyintF int OUTPUTF int OUTPUTAsAsSet F = 1Set F = 1while N gt 1while N gt 1beginbegin

set F = F Nset F = F NSet N = N - 1Set N = N - 1

endendreturn 0return 0

CursoresCursores

conjuntos de datosconjuntos de datos

Las aplicaciones de usuario estan Las aplicaciones de usuario estan desentildeadas para mostrar conjuntosdesentildeadas para mostrar conjuntos

de datos por registrosde datos por registros

Los cursores unen estos dos enfoquesLos cursores unen estos dos enfoques

Tenemos tres tipos de cursores en SQL Tenemos tres tipos de cursores en SQL ServerServer

ndash ndash Client cursorsClient cursors

ndash ndash API Server cursorsAPI Server cursors

ndash ndash Transact-SQL cursorsTransact-SQL cursors

CursoresCursoresTransact-SQL vs Resto de cursoresTransact-SQL vs Resto de cursores

La finalidad de los cursores es su La finalidad de los cursores es su principal diferenciaprincipal diferencia

1048698 1048698 Transact-SQL se utiliza enTransact-SQL se utiliza enndash ndash Los procedimientos almacenadosLos procedimientos almacenadosndash ndash Los procesos por lotesLos procesos por lotesndash ndash Las funcionesLas funcionesndash ndash Los disparadoresLos disparadores1048698 1048698 El resto de cursores se utilizan desde El resto de cursores se utilizan desde

las aplicaciones de loslas aplicaciones de losusuarios (normalmente en forma usuarios (normalmente en forma

embebida)embebida)

CursoresCursoresTransact-SQLTransact-SQL

1048698 1048698 Pasos a seguir en la definicioacuten de un cursor en un Pasos a seguir en la definicioacuten de un cursor en un procedimientoprocedimiento

almacenadoalmacenado1048698 1048698 1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1048698 1048698 2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor1048698 1048698 3 Utilizar la sentencia ldquoFetchrdquo para3 Utilizar la sentencia ldquoFetchrdquo para

ndash ndash recuperar los valores a los que apunta el cursorrecuperar los valores a los que apunta el cursorndash ndash cambiar la posicioacuten del puntero del cursorcambiar la posicioacuten del puntero del cursor

1048698 1048698 4 Ahora utilizamos los valores leidos para nuestros fines4 Ahora utilizamos los valores leidos para nuestros fines1048698 1048698 5 Si es necesario se repiten los pasos 3 y 45 Si es necesario se repiten los pasos 3 y 41048698 1048698 6 Cerramos el cursor para6 Cerramos el cursor para

ndash ndash desbloquear los datosdesbloquear los datosndash ndash liberar memorialiberar memoriandash ndash etcetc1048698 1048698 7 Eliminamos definitivamente el cursor7 Eliminamos definitivamente el cursor

Cursores EjemploCursores EjemploDefinimos los paraacutemetros y las variablesDefinimos los paraacutemetros y las variables

CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))AS AS BEGIN BEGIN

SET NOCOUNT OFF SET NOCOUNT OFF

DECLARE CAMPANA VARCHAR(20)DECLARE CAMPANA VARCHAR(20)DECLARE CODEJEC VARCHAR(10)DECLARE CODEJEC VARCHAR(10)DECLARE INDICE INTEGERDECLARE INDICE INTEGERDECLARE CORTIPOVTA CHAR(10)DECLARE CORTIPOVTA CHAR(10)

DECLARE ventas CURSOR FOR DECLARE ventas CURSOR FOR SELECT camp_tmk cod_agente indice2 cor_tipopersonaSELECT camp_tmk cod_agente indice2 cor_tipopersona FROM MON_VENTASEASIFROM MON_VENTASEASI WHERE fec_coti between FECHAINI and FECFINWHERE fec_coti between FECHAINI and FECFIN

AND cod_estado in (000PNDPRP)AND cod_estado in (000PNDPRP)

OPEN ventasOPEN ventas

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

ENDENDGOGO

Otro EjemploOtro Ejemplo

declare nombre varchar(50)declare direccion varchar(100)declare departamento_cursor cursor for

select nombre direccion from departamentoopen departamento_cursorfetch next from departamento_cursor into nombre direccionwhile fetch_status = 0begin

print(rsquoDepartamento de rsquo + nombre + rsquo Direcciacuteon rsquo + direccion)fetch next from departamento_cursor into nombre direccion

endclose departamento_cursordeallocate departamento_cursor

TriggersTriggers

No son mas que un caso particular deNo son mas que un caso particular deprocedimiento almacenadoprocedimiento almacenado1048698 1048698 No se pueden ejecutar directamenteNo se pueden ejecutar directamente1048698 1048698 Se ejecutan al realizarse alguna de Se ejecutan al realizarse alguna de

estasestasoperacionesoperacionesndash ndash Insercioacuten InsertInsercioacuten Insertndash ndash Modificacioacuten UpdateModificacioacuten Updatendash ndash Borrado DeleteBorrado Delete

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

Sentencias de control de flujoSentencias de control de flujoWhileWhile

While Boolean_expressionWhile Boolean_expressionsql_statement | statement_blocksql_statement | statement_block[Break][Break]sql_statement | statement_blocksql_statement | statement_block[Continue][Continue]sql_statement | statement_blocksql_statement | statement_blockResto de instruccionesResto de instrucciones

1048698 1048698 True = 1 False = 0True = 1 False = 01048698 1048698 Break El servidor interrumpe el bucle y salta a la siguienteBreak El servidor interrumpe el bucle y salta a la siguienteinstruccioacuten despueacutes del bucle Resto de instruccionesinstruccioacuten despueacutes del bucle Resto de instrucciones1048698 1048698 Continue El servidor vuelve inmediatamente a la guarda del Continue El servidor vuelve inmediatamente a la guarda del

buclebucleignorando el resto de instrucciones por ejecutar despueacutes de laignorando el resto de instrucciones por ejecutar despueacutes de lasentencia continue Boolean_expressionsentencia continue Boolean_expression

Sentencias de control de flujoSentencias de control de flujoEjemplo de la instruccioacuten WhileEjemplo de la instruccioacuten While

Create Procedure prCalcFactorialCreate Procedure prCalcFactorial-- calculate factorial-- calculate factorial-- 1 = 1-- 1 = 1-- 3 = 3 2 1-- 3 = 3 2 1-- n = n (n-1) 5 4 3 2 1-- n = n (n-1) 5 4 3 2 1

N tinyintN tinyintF int OUTPUTF int OUTPUTAsAsSet F = 1Set F = 1while N gt 1while N gt 1beginbegin

set F = F Nset F = F NSet N = N - 1Set N = N - 1

endendreturn 0return 0

CursoresCursores

conjuntos de datosconjuntos de datos

Las aplicaciones de usuario estan Las aplicaciones de usuario estan desentildeadas para mostrar conjuntosdesentildeadas para mostrar conjuntos

de datos por registrosde datos por registros

Los cursores unen estos dos enfoquesLos cursores unen estos dos enfoques

Tenemos tres tipos de cursores en SQL Tenemos tres tipos de cursores en SQL ServerServer

ndash ndash Client cursorsClient cursors

ndash ndash API Server cursorsAPI Server cursors

ndash ndash Transact-SQL cursorsTransact-SQL cursors

CursoresCursoresTransact-SQL vs Resto de cursoresTransact-SQL vs Resto de cursores

La finalidad de los cursores es su La finalidad de los cursores es su principal diferenciaprincipal diferencia

1048698 1048698 Transact-SQL se utiliza enTransact-SQL se utiliza enndash ndash Los procedimientos almacenadosLos procedimientos almacenadosndash ndash Los procesos por lotesLos procesos por lotesndash ndash Las funcionesLas funcionesndash ndash Los disparadoresLos disparadores1048698 1048698 El resto de cursores se utilizan desde El resto de cursores se utilizan desde

las aplicaciones de loslas aplicaciones de losusuarios (normalmente en forma usuarios (normalmente en forma

embebida)embebida)

CursoresCursoresTransact-SQLTransact-SQL

1048698 1048698 Pasos a seguir en la definicioacuten de un cursor en un Pasos a seguir en la definicioacuten de un cursor en un procedimientoprocedimiento

almacenadoalmacenado1048698 1048698 1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1048698 1048698 2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor1048698 1048698 3 Utilizar la sentencia ldquoFetchrdquo para3 Utilizar la sentencia ldquoFetchrdquo para

ndash ndash recuperar los valores a los que apunta el cursorrecuperar los valores a los que apunta el cursorndash ndash cambiar la posicioacuten del puntero del cursorcambiar la posicioacuten del puntero del cursor

1048698 1048698 4 Ahora utilizamos los valores leidos para nuestros fines4 Ahora utilizamos los valores leidos para nuestros fines1048698 1048698 5 Si es necesario se repiten los pasos 3 y 45 Si es necesario se repiten los pasos 3 y 41048698 1048698 6 Cerramos el cursor para6 Cerramos el cursor para

ndash ndash desbloquear los datosdesbloquear los datosndash ndash liberar memorialiberar memoriandash ndash etcetc1048698 1048698 7 Eliminamos definitivamente el cursor7 Eliminamos definitivamente el cursor

Cursores EjemploCursores EjemploDefinimos los paraacutemetros y las variablesDefinimos los paraacutemetros y las variables

CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))AS AS BEGIN BEGIN

SET NOCOUNT OFF SET NOCOUNT OFF

DECLARE CAMPANA VARCHAR(20)DECLARE CAMPANA VARCHAR(20)DECLARE CODEJEC VARCHAR(10)DECLARE CODEJEC VARCHAR(10)DECLARE INDICE INTEGERDECLARE INDICE INTEGERDECLARE CORTIPOVTA CHAR(10)DECLARE CORTIPOVTA CHAR(10)

DECLARE ventas CURSOR FOR DECLARE ventas CURSOR FOR SELECT camp_tmk cod_agente indice2 cor_tipopersonaSELECT camp_tmk cod_agente indice2 cor_tipopersona FROM MON_VENTASEASIFROM MON_VENTASEASI WHERE fec_coti between FECHAINI and FECFINWHERE fec_coti between FECHAINI and FECFIN

AND cod_estado in (000PNDPRP)AND cod_estado in (000PNDPRP)

OPEN ventasOPEN ventas

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

ENDENDGOGO

Otro EjemploOtro Ejemplo

declare nombre varchar(50)declare direccion varchar(100)declare departamento_cursor cursor for

select nombre direccion from departamentoopen departamento_cursorfetch next from departamento_cursor into nombre direccionwhile fetch_status = 0begin

print(rsquoDepartamento de rsquo + nombre + rsquo Direcciacuteon rsquo + direccion)fetch next from departamento_cursor into nombre direccion

endclose departamento_cursordeallocate departamento_cursor

TriggersTriggers

No son mas que un caso particular deNo son mas que un caso particular deprocedimiento almacenadoprocedimiento almacenado1048698 1048698 No se pueden ejecutar directamenteNo se pueden ejecutar directamente1048698 1048698 Se ejecutan al realizarse alguna de Se ejecutan al realizarse alguna de

estasestasoperacionesoperacionesndash ndash Insercioacuten InsertInsercioacuten Insertndash ndash Modificacioacuten UpdateModificacioacuten Updatendash ndash Borrado DeleteBorrado Delete

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

Sentencias de control de flujoSentencias de control de flujoEjemplo de la instruccioacuten WhileEjemplo de la instruccioacuten While

Create Procedure prCalcFactorialCreate Procedure prCalcFactorial-- calculate factorial-- calculate factorial-- 1 = 1-- 1 = 1-- 3 = 3 2 1-- 3 = 3 2 1-- n = n (n-1) 5 4 3 2 1-- n = n (n-1) 5 4 3 2 1

N tinyintN tinyintF int OUTPUTF int OUTPUTAsAsSet F = 1Set F = 1while N gt 1while N gt 1beginbegin

set F = F Nset F = F NSet N = N - 1Set N = N - 1

endendreturn 0return 0

CursoresCursores

conjuntos de datosconjuntos de datos

Las aplicaciones de usuario estan Las aplicaciones de usuario estan desentildeadas para mostrar conjuntosdesentildeadas para mostrar conjuntos

de datos por registrosde datos por registros

Los cursores unen estos dos enfoquesLos cursores unen estos dos enfoques

Tenemos tres tipos de cursores en SQL Tenemos tres tipos de cursores en SQL ServerServer

ndash ndash Client cursorsClient cursors

ndash ndash API Server cursorsAPI Server cursors

ndash ndash Transact-SQL cursorsTransact-SQL cursors

CursoresCursoresTransact-SQL vs Resto de cursoresTransact-SQL vs Resto de cursores

La finalidad de los cursores es su La finalidad de los cursores es su principal diferenciaprincipal diferencia

1048698 1048698 Transact-SQL se utiliza enTransact-SQL se utiliza enndash ndash Los procedimientos almacenadosLos procedimientos almacenadosndash ndash Los procesos por lotesLos procesos por lotesndash ndash Las funcionesLas funcionesndash ndash Los disparadoresLos disparadores1048698 1048698 El resto de cursores se utilizan desde El resto de cursores se utilizan desde

las aplicaciones de loslas aplicaciones de losusuarios (normalmente en forma usuarios (normalmente en forma

embebida)embebida)

CursoresCursoresTransact-SQLTransact-SQL

1048698 1048698 Pasos a seguir en la definicioacuten de un cursor en un Pasos a seguir en la definicioacuten de un cursor en un procedimientoprocedimiento

almacenadoalmacenado1048698 1048698 1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1048698 1048698 2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor1048698 1048698 3 Utilizar la sentencia ldquoFetchrdquo para3 Utilizar la sentencia ldquoFetchrdquo para

ndash ndash recuperar los valores a los que apunta el cursorrecuperar los valores a los que apunta el cursorndash ndash cambiar la posicioacuten del puntero del cursorcambiar la posicioacuten del puntero del cursor

1048698 1048698 4 Ahora utilizamos los valores leidos para nuestros fines4 Ahora utilizamos los valores leidos para nuestros fines1048698 1048698 5 Si es necesario se repiten los pasos 3 y 45 Si es necesario se repiten los pasos 3 y 41048698 1048698 6 Cerramos el cursor para6 Cerramos el cursor para

ndash ndash desbloquear los datosdesbloquear los datosndash ndash liberar memorialiberar memoriandash ndash etcetc1048698 1048698 7 Eliminamos definitivamente el cursor7 Eliminamos definitivamente el cursor

Cursores EjemploCursores EjemploDefinimos los paraacutemetros y las variablesDefinimos los paraacutemetros y las variables

CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))AS AS BEGIN BEGIN

SET NOCOUNT OFF SET NOCOUNT OFF

DECLARE CAMPANA VARCHAR(20)DECLARE CAMPANA VARCHAR(20)DECLARE CODEJEC VARCHAR(10)DECLARE CODEJEC VARCHAR(10)DECLARE INDICE INTEGERDECLARE INDICE INTEGERDECLARE CORTIPOVTA CHAR(10)DECLARE CORTIPOVTA CHAR(10)

DECLARE ventas CURSOR FOR DECLARE ventas CURSOR FOR SELECT camp_tmk cod_agente indice2 cor_tipopersonaSELECT camp_tmk cod_agente indice2 cor_tipopersona FROM MON_VENTASEASIFROM MON_VENTASEASI WHERE fec_coti between FECHAINI and FECFINWHERE fec_coti between FECHAINI and FECFIN

AND cod_estado in (000PNDPRP)AND cod_estado in (000PNDPRP)

OPEN ventasOPEN ventas

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

ENDENDGOGO

Otro EjemploOtro Ejemplo

declare nombre varchar(50)declare direccion varchar(100)declare departamento_cursor cursor for

select nombre direccion from departamentoopen departamento_cursorfetch next from departamento_cursor into nombre direccionwhile fetch_status = 0begin

print(rsquoDepartamento de rsquo + nombre + rsquo Direcciacuteon rsquo + direccion)fetch next from departamento_cursor into nombre direccion

endclose departamento_cursordeallocate departamento_cursor

TriggersTriggers

No son mas que un caso particular deNo son mas que un caso particular deprocedimiento almacenadoprocedimiento almacenado1048698 1048698 No se pueden ejecutar directamenteNo se pueden ejecutar directamente1048698 1048698 Se ejecutan al realizarse alguna de Se ejecutan al realizarse alguna de

estasestasoperacionesoperacionesndash ndash Insercioacuten InsertInsercioacuten Insertndash ndash Modificacioacuten UpdateModificacioacuten Updatendash ndash Borrado DeleteBorrado Delete

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

CursoresCursores

conjuntos de datosconjuntos de datos

Las aplicaciones de usuario estan Las aplicaciones de usuario estan desentildeadas para mostrar conjuntosdesentildeadas para mostrar conjuntos

de datos por registrosde datos por registros

Los cursores unen estos dos enfoquesLos cursores unen estos dos enfoques

Tenemos tres tipos de cursores en SQL Tenemos tres tipos de cursores en SQL ServerServer

ndash ndash Client cursorsClient cursors

ndash ndash API Server cursorsAPI Server cursors

ndash ndash Transact-SQL cursorsTransact-SQL cursors

CursoresCursoresTransact-SQL vs Resto de cursoresTransact-SQL vs Resto de cursores

La finalidad de los cursores es su La finalidad de los cursores es su principal diferenciaprincipal diferencia

1048698 1048698 Transact-SQL se utiliza enTransact-SQL se utiliza enndash ndash Los procedimientos almacenadosLos procedimientos almacenadosndash ndash Los procesos por lotesLos procesos por lotesndash ndash Las funcionesLas funcionesndash ndash Los disparadoresLos disparadores1048698 1048698 El resto de cursores se utilizan desde El resto de cursores se utilizan desde

las aplicaciones de loslas aplicaciones de losusuarios (normalmente en forma usuarios (normalmente en forma

embebida)embebida)

CursoresCursoresTransact-SQLTransact-SQL

1048698 1048698 Pasos a seguir en la definicioacuten de un cursor en un Pasos a seguir en la definicioacuten de un cursor en un procedimientoprocedimiento

almacenadoalmacenado1048698 1048698 1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1048698 1048698 2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor1048698 1048698 3 Utilizar la sentencia ldquoFetchrdquo para3 Utilizar la sentencia ldquoFetchrdquo para

ndash ndash recuperar los valores a los que apunta el cursorrecuperar los valores a los que apunta el cursorndash ndash cambiar la posicioacuten del puntero del cursorcambiar la posicioacuten del puntero del cursor

1048698 1048698 4 Ahora utilizamos los valores leidos para nuestros fines4 Ahora utilizamos los valores leidos para nuestros fines1048698 1048698 5 Si es necesario se repiten los pasos 3 y 45 Si es necesario se repiten los pasos 3 y 41048698 1048698 6 Cerramos el cursor para6 Cerramos el cursor para

ndash ndash desbloquear los datosdesbloquear los datosndash ndash liberar memorialiberar memoriandash ndash etcetc1048698 1048698 7 Eliminamos definitivamente el cursor7 Eliminamos definitivamente el cursor

Cursores EjemploCursores EjemploDefinimos los paraacutemetros y las variablesDefinimos los paraacutemetros y las variables

CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))AS AS BEGIN BEGIN

SET NOCOUNT OFF SET NOCOUNT OFF

DECLARE CAMPANA VARCHAR(20)DECLARE CAMPANA VARCHAR(20)DECLARE CODEJEC VARCHAR(10)DECLARE CODEJEC VARCHAR(10)DECLARE INDICE INTEGERDECLARE INDICE INTEGERDECLARE CORTIPOVTA CHAR(10)DECLARE CORTIPOVTA CHAR(10)

DECLARE ventas CURSOR FOR DECLARE ventas CURSOR FOR SELECT camp_tmk cod_agente indice2 cor_tipopersonaSELECT camp_tmk cod_agente indice2 cor_tipopersona FROM MON_VENTASEASIFROM MON_VENTASEASI WHERE fec_coti between FECHAINI and FECFINWHERE fec_coti between FECHAINI and FECFIN

AND cod_estado in (000PNDPRP)AND cod_estado in (000PNDPRP)

OPEN ventasOPEN ventas

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

ENDENDGOGO

Otro EjemploOtro Ejemplo

declare nombre varchar(50)declare direccion varchar(100)declare departamento_cursor cursor for

select nombre direccion from departamentoopen departamento_cursorfetch next from departamento_cursor into nombre direccionwhile fetch_status = 0begin

print(rsquoDepartamento de rsquo + nombre + rsquo Direcciacuteon rsquo + direccion)fetch next from departamento_cursor into nombre direccion

endclose departamento_cursordeallocate departamento_cursor

TriggersTriggers

No son mas que un caso particular deNo son mas que un caso particular deprocedimiento almacenadoprocedimiento almacenado1048698 1048698 No se pueden ejecutar directamenteNo se pueden ejecutar directamente1048698 1048698 Se ejecutan al realizarse alguna de Se ejecutan al realizarse alguna de

estasestasoperacionesoperacionesndash ndash Insercioacuten InsertInsercioacuten Insertndash ndash Modificacioacuten UpdateModificacioacuten Updatendash ndash Borrado DeleteBorrado Delete

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

CursoresCursoresTransact-SQL vs Resto de cursoresTransact-SQL vs Resto de cursores

La finalidad de los cursores es su La finalidad de los cursores es su principal diferenciaprincipal diferencia

1048698 1048698 Transact-SQL se utiliza enTransact-SQL se utiliza enndash ndash Los procedimientos almacenadosLos procedimientos almacenadosndash ndash Los procesos por lotesLos procesos por lotesndash ndash Las funcionesLas funcionesndash ndash Los disparadoresLos disparadores1048698 1048698 El resto de cursores se utilizan desde El resto de cursores se utilizan desde

las aplicaciones de loslas aplicaciones de losusuarios (normalmente en forma usuarios (normalmente en forma

embebida)embebida)

CursoresCursoresTransact-SQLTransact-SQL

1048698 1048698 Pasos a seguir en la definicioacuten de un cursor en un Pasos a seguir en la definicioacuten de un cursor en un procedimientoprocedimiento

almacenadoalmacenado1048698 1048698 1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1048698 1048698 2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor1048698 1048698 3 Utilizar la sentencia ldquoFetchrdquo para3 Utilizar la sentencia ldquoFetchrdquo para

ndash ndash recuperar los valores a los que apunta el cursorrecuperar los valores a los que apunta el cursorndash ndash cambiar la posicioacuten del puntero del cursorcambiar la posicioacuten del puntero del cursor

1048698 1048698 4 Ahora utilizamos los valores leidos para nuestros fines4 Ahora utilizamos los valores leidos para nuestros fines1048698 1048698 5 Si es necesario se repiten los pasos 3 y 45 Si es necesario se repiten los pasos 3 y 41048698 1048698 6 Cerramos el cursor para6 Cerramos el cursor para

ndash ndash desbloquear los datosdesbloquear los datosndash ndash liberar memorialiberar memoriandash ndash etcetc1048698 1048698 7 Eliminamos definitivamente el cursor7 Eliminamos definitivamente el cursor

Cursores EjemploCursores EjemploDefinimos los paraacutemetros y las variablesDefinimos los paraacutemetros y las variables

CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))AS AS BEGIN BEGIN

SET NOCOUNT OFF SET NOCOUNT OFF

DECLARE CAMPANA VARCHAR(20)DECLARE CAMPANA VARCHAR(20)DECLARE CODEJEC VARCHAR(10)DECLARE CODEJEC VARCHAR(10)DECLARE INDICE INTEGERDECLARE INDICE INTEGERDECLARE CORTIPOVTA CHAR(10)DECLARE CORTIPOVTA CHAR(10)

DECLARE ventas CURSOR FOR DECLARE ventas CURSOR FOR SELECT camp_tmk cod_agente indice2 cor_tipopersonaSELECT camp_tmk cod_agente indice2 cor_tipopersona FROM MON_VENTASEASIFROM MON_VENTASEASI WHERE fec_coti between FECHAINI and FECFINWHERE fec_coti between FECHAINI and FECFIN

AND cod_estado in (000PNDPRP)AND cod_estado in (000PNDPRP)

OPEN ventasOPEN ventas

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

ENDENDGOGO

Otro EjemploOtro Ejemplo

declare nombre varchar(50)declare direccion varchar(100)declare departamento_cursor cursor for

select nombre direccion from departamentoopen departamento_cursorfetch next from departamento_cursor into nombre direccionwhile fetch_status = 0begin

print(rsquoDepartamento de rsquo + nombre + rsquo Direcciacuteon rsquo + direccion)fetch next from departamento_cursor into nombre direccion

endclose departamento_cursordeallocate departamento_cursor

TriggersTriggers

No son mas que un caso particular deNo son mas que un caso particular deprocedimiento almacenadoprocedimiento almacenado1048698 1048698 No se pueden ejecutar directamenteNo se pueden ejecutar directamente1048698 1048698 Se ejecutan al realizarse alguna de Se ejecutan al realizarse alguna de

estasestasoperacionesoperacionesndash ndash Insercioacuten InsertInsercioacuten Insertndash ndash Modificacioacuten UpdateModificacioacuten Updatendash ndash Borrado DeleteBorrado Delete

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

CursoresCursoresTransact-SQLTransact-SQL

1048698 1048698 Pasos a seguir en la definicioacuten de un cursor en un Pasos a seguir en la definicioacuten de un cursor en un procedimientoprocedimiento

almacenadoalmacenado1048698 1048698 1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1 Utilizar la sentencia ldquoDeclare Cursorrdquo para crear el cursor1048698 1048698 2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor2 Llamar a la sentencia ldquoOpenrdquo para activar el cursor1048698 1048698 3 Utilizar la sentencia ldquoFetchrdquo para3 Utilizar la sentencia ldquoFetchrdquo para

ndash ndash recuperar los valores a los que apunta el cursorrecuperar los valores a los que apunta el cursorndash ndash cambiar la posicioacuten del puntero del cursorcambiar la posicioacuten del puntero del cursor

1048698 1048698 4 Ahora utilizamos los valores leidos para nuestros fines4 Ahora utilizamos los valores leidos para nuestros fines1048698 1048698 5 Si es necesario se repiten los pasos 3 y 45 Si es necesario se repiten los pasos 3 y 41048698 1048698 6 Cerramos el cursor para6 Cerramos el cursor para

ndash ndash desbloquear los datosdesbloquear los datosndash ndash liberar memorialiberar memoriandash ndash etcetc1048698 1048698 7 Eliminamos definitivamente el cursor7 Eliminamos definitivamente el cursor

Cursores EjemploCursores EjemploDefinimos los paraacutemetros y las variablesDefinimos los paraacutemetros y las variables

CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))AS AS BEGIN BEGIN

SET NOCOUNT OFF SET NOCOUNT OFF

DECLARE CAMPANA VARCHAR(20)DECLARE CAMPANA VARCHAR(20)DECLARE CODEJEC VARCHAR(10)DECLARE CODEJEC VARCHAR(10)DECLARE INDICE INTEGERDECLARE INDICE INTEGERDECLARE CORTIPOVTA CHAR(10)DECLARE CORTIPOVTA CHAR(10)

DECLARE ventas CURSOR FOR DECLARE ventas CURSOR FOR SELECT camp_tmk cod_agente indice2 cor_tipopersonaSELECT camp_tmk cod_agente indice2 cor_tipopersona FROM MON_VENTASEASIFROM MON_VENTASEASI WHERE fec_coti between FECHAINI and FECFINWHERE fec_coti between FECHAINI and FECFIN

AND cod_estado in (000PNDPRP)AND cod_estado in (000PNDPRP)

OPEN ventasOPEN ventas

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

ENDENDGOGO

Otro EjemploOtro Ejemplo

declare nombre varchar(50)declare direccion varchar(100)declare departamento_cursor cursor for

select nombre direccion from departamentoopen departamento_cursorfetch next from departamento_cursor into nombre direccionwhile fetch_status = 0begin

print(rsquoDepartamento de rsquo + nombre + rsquo Direcciacuteon rsquo + direccion)fetch next from departamento_cursor into nombre direccion

endclose departamento_cursordeallocate departamento_cursor

TriggersTriggers

No son mas que un caso particular deNo son mas que un caso particular deprocedimiento almacenadoprocedimiento almacenado1048698 1048698 No se pueden ejecutar directamenteNo se pueden ejecutar directamente1048698 1048698 Se ejecutan al realizarse alguna de Se ejecutan al realizarse alguna de

estasestasoperacionesoperacionesndash ndash Insercioacuten InsertInsercioacuten Insertndash ndash Modificacioacuten UpdateModificacioacuten Updatendash ndash Borrado DeleteBorrado Delete

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

Cursores EjemploCursores EjemploDefinimos los paraacutemetros y las variablesDefinimos los paraacutemetros y las variables

CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))CREATE PROCEDURE dboSP_SUMAVENTASEASI (FECHAINI AS VARCHAR(10) FECFIN AS VARCHAR(10))AS AS BEGIN BEGIN

SET NOCOUNT OFF SET NOCOUNT OFF

DECLARE CAMPANA VARCHAR(20)DECLARE CAMPANA VARCHAR(20)DECLARE CODEJEC VARCHAR(10)DECLARE CODEJEC VARCHAR(10)DECLARE INDICE INTEGERDECLARE INDICE INTEGERDECLARE CORTIPOVTA CHAR(10)DECLARE CORTIPOVTA CHAR(10)

DECLARE ventas CURSOR FOR DECLARE ventas CURSOR FOR SELECT camp_tmk cod_agente indice2 cor_tipopersonaSELECT camp_tmk cod_agente indice2 cor_tipopersona FROM MON_VENTASEASIFROM MON_VENTASEASI WHERE fec_coti between FECHAINI and FECFINWHERE fec_coti between FECHAINI and FECFIN

AND cod_estado in (000PNDPRP)AND cod_estado in (000PNDPRP)

OPEN ventasOPEN ventas

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA WHILE FETCH_STATUS = 0WHILE FETCH_STATUS = 0 BEGINBEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET CANTIDAD = isnull(CANTIDAD0) + 1 SET CANTIDAD = isnull(CANTIDAD0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE

IF CORTIPOVTA = TIT IF CORTIPOVTA = TIT BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET TITULAR = isnull(TITULAR0) + 1 SET TITULAR = isnull(TITULAR0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

--- --- AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

IF CORTIPOVTA = ADI IF CORTIPOVTA = ADI BEGIN BEGIN

UPDATE MON_MONITOREOUPDATE MON_MONITOREO SET ADICIONAL = isnull(ADICIONAL0) + 1 SET ADICIONAL = isnull(ADICIONAL0) + 1 WHERE CAMP_NOMBRE = CAMPANAWHERE CAMP_NOMBRE = CAMPANA

------ AND AND CODEJECUTIVO = CODEJEC CODEJECUTIVO = CODEJEC AND INDICE AND INDICE = INDICE = INDICE END END

FETCH NEXT FROM ventas FETCH NEXT FROM ventas INTO CAMPANA CODEJEC INDICE CORTIPOVTAINTO CAMPANA CODEJEC INDICE CORTIPOVTA

END END CLOSE ventas CLOSE ventas DEALLOCATE ventasDEALLOCATE ventas

ENDENDGOGO

Otro EjemploOtro Ejemplo

declare nombre varchar(50)declare direccion varchar(100)declare departamento_cursor cursor for

select nombre direccion from departamentoopen departamento_cursorfetch next from departamento_cursor into nombre direccionwhile fetch_status = 0begin

print(rsquoDepartamento de rsquo + nombre + rsquo Direcciacuteon rsquo + direccion)fetch next from departamento_cursor into nombre direccion

endclose departamento_cursordeallocate departamento_cursor

TriggersTriggers

No son mas que un caso particular deNo son mas que un caso particular deprocedimiento almacenadoprocedimiento almacenado1048698 1048698 No se pueden ejecutar directamenteNo se pueden ejecutar directamente1048698 1048698 Se ejecutan al realizarse alguna de Se ejecutan al realizarse alguna de

estasestasoperacionesoperacionesndash ndash Insercioacuten InsertInsercioacuten Insertndash ndash Modificacioacuten UpdateModificacioacuten Updatendash ndash Borrado DeleteBorrado Delete

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

Otro EjemploOtro Ejemplo

declare nombre varchar(50)declare direccion varchar(100)declare departamento_cursor cursor for

select nombre direccion from departamentoopen departamento_cursorfetch next from departamento_cursor into nombre direccionwhile fetch_status = 0begin

print(rsquoDepartamento de rsquo + nombre + rsquo Direcciacuteon rsquo + direccion)fetch next from departamento_cursor into nombre direccion

endclose departamento_cursordeallocate departamento_cursor

TriggersTriggers

No son mas que un caso particular deNo son mas que un caso particular deprocedimiento almacenadoprocedimiento almacenado1048698 1048698 No se pueden ejecutar directamenteNo se pueden ejecutar directamente1048698 1048698 Se ejecutan al realizarse alguna de Se ejecutan al realizarse alguna de

estasestasoperacionesoperacionesndash ndash Insercioacuten InsertInsercioacuten Insertndash ndash Modificacioacuten UpdateModificacioacuten Updatendash ndash Borrado DeleteBorrado Delete

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

TriggersTriggers

No son mas que un caso particular deNo son mas que un caso particular deprocedimiento almacenadoprocedimiento almacenado1048698 1048698 No se pueden ejecutar directamenteNo se pueden ejecutar directamente1048698 1048698 Se ejecutan al realizarse alguna de Se ejecutan al realizarse alguna de

estasestasoperacionesoperacionesndash ndash Insercioacuten InsertInsercioacuten Insertndash ndash Modificacioacuten UpdateModificacioacuten Updatendash ndash Borrado DeleteBorrado Delete

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

TriggersTriggers

Create Trigger Create Trigger trigger_nametrigger_nameOn table | view [With Encryption]On table | view [With Encryption]For | After | Instead Of [Delete] [] [Insert] [] [Update] For | After | Instead Of [Delete] [] [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAssql_statement [n]sql_statement [n] | |(For | After | Instead Of) [Insert] [] [Update] (For | After | Instead Of) [Insert] [] [Update] [With Append][With Append][Not For Replication][Not For Replication]AsAsIf Update ( Column)If Update ( Column)[And | Or Update ( Column)][And | Or Update ( Column)][n] | If ( Columns_Updated() bitwise_operator updated_bitmask)[n] | If ( Columns_Updated() bitwise_operator updated_bitmask) comparison_operator column_bitmask [n] comparison_operator column_bitmask [n] sql_statement [n]sql_statement [n]

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

Trigger Create triggerTrigger Create trigger

Indica al SQL Server que vamos a Indica al SQL Server que vamos a crear uncrear un

objeto en la BD del tipo TRIGGERobjeto en la BD del tipo TRIGGER

1048698 1048698 La BD maneja objetos triggers La BD maneja objetos triggers storestore

procedures tables viewsprocedures tables views

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

Ejemplo de TriggerEjemplo de Triggercreate trigger minimo_salario_supervisoron empleadoafter updateas

if update(salario)begin

update empleadoset salario = 500000where rut in (select rutfrom inserted as i join supervisa_departamento as son sempleado_rut = irutwhere isalario lt 500000 )

end

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

FuncionesFunciones

Usando bloques de instrucciones se pueden crear funciones de

usuario que pueden usarse en consultas simplesSe usa el comando create function para crearlas y

returnpara el valor de retornocreate function func(parametro1 tipo1 )returns moneyas

beginreturn valor_retorno

end

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado

Funciones ya Construidas

SQLServer al igual que la mayoracuteıa de los DBMS comerciales

provee funciones ya construidasFunciones para manipular fechasday month year getdate dateaddFunciones matemacuteaticas abs cos sin floor

ceilingFunciones de strings substring lower upper

trimPueden crearse funciones macuteas complejas que usen

estas funcionespara calcular su resultado