Post on 24-Oct-2015
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