Está en la página 1de 15
Objetivo ee : : q El objetivo de esta unidad es ilustrar respecto al uso de estructuras de decisién y contra que permiten codificar logica de negocios a partir de decisiones e iteraciones de bloque: cédigo. Esta unidad es fundamental si se desea elaborar procedimientos almacenados responderdn a peticiones desde aplicativos. TeComentarios Gace yar ae La forma de comentar los programas en SQL Server es de dos maneras: a) Utilizando di guidn al inicio de Ifnea (--), llamado comentario por Ifnea; o b) con el convencionalism lenguaje C (/* comentario */), llamado comentario por bloque. Los comentarios ca: de valor para el motor de ejecucion de SQL Server. Es interesante comprobar que los comentarios por linea pueden colocarse practicam en cualquier parte. ® _Utilizando comentarios por bloque, en linea, y en linea sobre programa. /* Comentarios .sql Programa para la comprobacién del uso de comentarios Autor: José Felipe Ramirez Fecha: 01/01/2005 " Select +» Todos los campos From authors -- Autores de libros -+ Fin del prograna 2: Print : PRINT es una instruccién que retorna una expresién de tipo caracter como salida de un proceso. Utilizar esta instruccién es la forma mas basica de generar una cadena de caracteres como maximo. Es posible desplegar una cadena literal, o bien el contenido de una variable de tipo char 0 varchar. PRINT toma un tinico parametro: la cadena literal ola variable. Vea el siguiente ejemplo. ® _ vtilizando PRINT para generar resultados hacia el cliente SQL. PRINT @Fecha = ‘Hoy es ¢ + CONVERT(varchar(11), GETDATE(), 100) Una consideracién importante es que PRINT trabaja con valores constantes preferente- mente. Por ejemplo, el siguiente estatuto generaria error. print “Autores:" + str((select count(*) from authors)) Una soluci6n seria trabajar el proceso con el apoyo de una variable de memoria. Declare @Resultado char(1e@) Set @Resultado = ‘Autores:' + str((select count(*) from authors) print @Resultado : Variables de memoria Las variables de memoria son identificadores légicos que apuntan a posiciones fisicas de lamemoria RAM. SQL Server permite dos tipos de variables: Locales y Globales. 3.1: Variables locales Las variables que usted declare en sus programas sern variables locales, y tendran ambi- toy visibilidad s6lo dentro de la conexién que las ha declarado. En el c6digo, el caracter @ designa una variable local. Las variables locales se declaran al principio de un proceso por lotes 0 procedimiento alma- cenado, Después es posible asignarle valores a variables locales con la instruccién SELECT, utilizando el operador de asignacién. Los valores asignados pueden ser constantes, otras variables o expresiones, y suelen sele= cionarse desde una columna en una tabla, ‘Tenga cuidado al asignar variables seleccionando un valor desde la base de datos, ya que debera asegurar que la instruccién SELECT devuelva un solo dato (una fila con una colus na), a lo que se conoce como consultas escalares. A menudo sera una funci6n agregada, © mo MAX(); MINQ, 0 SUM) (consultas escalares) Las variables locales se definen a través del estatuto DECLARE: DECLARE @NonbreVariable Tipo[ (longitud)] Es posible asignarle valores utilizando SET 0 SELECT: SET @NombreVariable = valor O bien... SELECT @NonbreVariable = valor B® _ Deciarando una variable e imprimiendo el valor que se le ha asignado. DECLARE @afio integer SET @afio = 1994 PRINT @afio B® _ beclaracién, asignacion de valor, y uso de una variable en un script que mos- traré el resumen de cantidad de unidades vendidas por titulo, en el afio que se especifique. Parametrizando una consulta met ite el uso de variables, Use pubs Declare @afio integer Select @afio = 1994 Select titles.title, sum(sales.qty) From sales, titles Where sales.title_id = titles.title_id and datepart (yy,sales.ord_date) = @afio Group by titles.title ® _ Declaracién de una variable local, asignéndole el producto de una consulta que retorna un solo valor (consulta escalar de funcién agregada). En términos ge- nerales, se busca aquellas ventas que estuvieron, en volumen, por encima del promedio. Use pubs Declare @promedio_volumen integer Select @promedio_volumen = (select avg(qty) from sales) Print @promedio_volumen Select sales.ord_num, sales.qty From sales Where sales.qty >= @promedio_volumen 3.2: Variables Globales (Funciones) Las denominadas variables globales, que ahora en SQL Server son llamadas funciones, o funciones escalares, almacenan valores generados por SQL Server, relacionados con la ins- tancia y la ejecucién de procesos, y que el desarrollador puede utilizar como recursos in- formativos. _ Estas variables globales o funciones no pueden ser declaradas por los usua- rios, ya que forman parte del producto. Se identifican a través de @@ + el nombre del identificador. Todas las conexiones tienen acceso a estas funciones. Actualmente, una conexién de usua- rio no puede declarar este tipo de funciones. Se pueden clasificar en varios tipos. * Configuracién. Estas funciones escalares devuelven informacién acerca de las opciones de configuracién actuales. @@DATEFIRST @@oPTIONS @aoeTs @@REMSERVER @@LANGID @@SERVERNAME @@LANGUAGE (@@SERVICENAME @@LOCK_TIMEOUT — @@SPID @@MAX_CONNECTIONS @@TEXTSIZE @@MAX_PRECTSION — @@VERSTON @@NESTLEVEL + Cursor. Estas funciones escalares devuelven informacién acerca de los cursores. @@cuRsoR-Rows GGFETCH STATUS + Funciones del sistema. Estas funciones escalares realizan operaciones y de- vuelven informacién sobre valores, objetos y configuraciones de SQL Server. @@ERROR @@IDENTITY @@ROWCOUNT @@TRANCOUNT * Funciones estadisticas del sistema. Estas funciones escalares devuelven informacion estadistica acerca del sistema. @@CONNECTIONS @@CPU_BUSY @aTIMETICKs @@I0LE @@10_BUsY G@aPACKET_ERRORS @@PACK_RECEIVED @@PACK_SENT @@TOTAL_ERRORS @@TOTAL_READ @@TOTAL_WRITE ® comprobacién de la existencia de las variables globales (observe cémo la va- riable es utilizada, aunque usted no la declare en ningun lado). Use pubs Select * from authors Print @@rowcount @@rowcount por lo general muestra lo que SQL Server le muestra siempre Por omisi6n; si se fija en el resultado anterior, al final de los resultados apare- ceré lo siguiente: (23 row(s) affected) 23 El primer reporte de filas afectadas (rows affected) es el que da por omisién SQL Server, y el segundo, es la impresin de @@rowcount; esto puede llevar a Pensar en lo innecesario de utilizar la variable para ver algo que ya conoce- mos. Sin embargo, puede ser que usted haya decidido una ejecucién mas limpia (sin mensajes que usted no requiera, 0 informacién de encabezados sin ocurrencias de datos), a través del uso del estatuto SET NOCOUNT. Ejemplo: Use pubs Set nocount on Select * from authors Print @@rowcount Bajo este supuesto, el reporte de filas afectadas (rows affected) no apareceria, ¥ 86lo conoceriamos el dato a través de la variable global. 4; Bloques de codigo (Begin - End) cee Un bloque de cédigo es un conjunto de estatutos que comparten un momento y circuns- tancia de ejecucién, estan delimitados por las instrucciones BEGIN y END, y pueden estar anidados. Un solo estatuto no requiere de BEGIN y END, ya que no constituye un bloque de cédigo. Agregarlo en el cddigo no tiene ningtin sentido. Cuando requerimos trabajar con un bloque de cédigo, es necesario que todos los estatutos que componen dicho bloque, estén delimitados por las palabras reservadas BEGIN - END. De tal forma, éstos serdn tomados como una unidad de cbdigo, que se ejecutaré en una de- terminada circunstancia. La sintaxis de un bloque delimitado es: Begin <2 0 mis lineas de cédigo> End Las instrucciones BEGIN ~ END son esenciales para la programacién en Transact-SQL, ya que es la tinica forma de procesar mas de una linea, considerandola como unidad de proce- samiento. 5: Estructuras de decision y control Como cualquier lenguaje de programacién que merezca dicho nombre, Transact-SQL pro- Pporciona un conjunto de herramientas para el control de flujo de procesamiento. Se dividen en dos categorias: + Estructuras de decisiém. Dependiendo del resultado de una condicién logica (booleana), se provoca la ejecucién de una determinada instruccién o bloque de eé- digo. + Estructuras de control. Repiten la ejecucién de una instruccién o bloque de cédigo dependiendo de la evaluacién de condiciones. IFELSE es el estatuto condicional que, dependiendo de una condicién y la forma en que se resuelve (verdadero 0 falso), se ejecutard un estatuto 0 bloque de cédigo determinado. Su sintaxis es la siguiente, If Begin End [else begin end) B® se deen obtener tas ventas de un determinado titulo; a) si el titulo ha sido vendido, se debe mostrar un mensaje que nos diga que el titulo ha tenido ven- {as, para posteriormente detallar todas las ventas correspondientes. b) En ca- so de que no se haya vendido el titulo, debe aparecer un mensaje que diga que el titulo no se ha vendido, sugiriendo intentar con otro, Use pubs Set nocount on declare @ocurrencias integer declare @titulo char(1e) Select @titulo = “pcie35’ Select @ocurrencias = (select ‘count(*) fron sales where sales.title id = @titulo) If Gocurrencias > 0 Begin Print ‘Ventas encontradas? Select sales.ord_num, sales.qty, sales.title_id From sales Where sales.title_id = @titulo end else begin print ‘No se encontraron ocurrencias* print ‘Intente otro titulo’ end 5.2: CASE CASE es una instruccién que evalia una lista de condiciones y devuelve como resultado una de las distintas expresiones posibles, CASE es una expresién, no una palabra clave del control de flujo, lo que significa que puede utilizarse en instrucciones SELECT 0 UPDATE. Su sintaxis es la siguiente. CASE WHEN condicién THEN valor [ELSE valor] END Ademéas, CASE admite que, en caso de que ninguna de las condiciones WHEN sea vali exista una salida por omisién, a través de ELSE. CASE define un bloque de cédigo, po mismo. B® Las ventas tienen diferentes ‘categorias: menores a 30 piezas, son consideradas Pequehas, de 30 a 50 son consideradas buenas, y de més de 50, son considera, Gas excelentes. Despliegue las 6rdenes de venta, sehalando de qué categoria de venta se trata, Use pubs Select sales.ord_num, Categoria = CASE when sales.qty < 30 then ‘pequefias? iuhen sales.qty between 3@ and 50 then ‘buenas? else ‘excelentes? B estatuto WHILE permite la ejecucién iterativa de un bloque de cédigo, mientras se cum. pla una condicién especificada por verdadero. Este estatuto se apaya de dos auxliares: BREAK, que se encarga de trasladar el control de cedar ees nuts Gel bloque de cédigo iterativo; CONTINUE, se encarga de reiniciar la ejecu in del bloque de cddigo,omitiendo la elecucién de las lineas que sigan a CONTINUE La sintaxis de WHILE es la siguiente. 1. WHILE Condicién 2 ebloque de ebdigo> 3. [BREAK] 4. (CONTINUE) ® Consulta que determina la cantidad maxima vendida en una sola orden. Des- pués muestra cuantas érdenes se vendieron por cada una de las posibles can- tidades de venta, mientras que no se sobrepase el niimero maximo, pues ya no tendria caso. Declare @naxino integer set @naximo = (select max(qty) from sales) print 'Méxima cantidad vendida:' + str(@naximo) print ‘Ordenes por cantidad vendida. { declare @contador integer declare @ordenes integer set @contador = 1 while @contador <= @naxino Begin set @ordenes = (select count(*) from sales where qty-@contador) print ‘Ordenes que se vendieron str(@contador) + *:* + str(@ordenes) set @contador = @contador + 1 End 5.4: GOTO La instruccién GOTO permite transferir el control del programa a alguna posicién marcada a través de una etiqueta de posicién. Las etiquetas de posicién son referencias tnicas dentro de un programa, que deben aparecer en una linea, seguida por dos puntos (:) Una instruccién, goto ETIQUETA ‘Trasladard el control ala inea de cédigo.. ETIQUETA: B® labore el ejercicio anterior de una manera mas elaborada. ‘Agregue comen- tarios. Antes de investigar las ventas del titulo, investigue si el titulo mismo existe (si no existe zcémo analizamos sus ventas?) Controle el flujo del pro- grama utilizando un GOTO. Pruebe el programa asignando a la variable @titulo los valores PC1035 (que s{ existe) y PCO000 (que no existe) /* Analisis de ventas Permite analizar las ventas que se han tenido de un determinado titu- lo. ee Use pubs + Se anula la salida autonatica de SQL Server set nocount on -- Declaracion de variables declare @ocurrencias integer declare @titulo char(10) declare @nensaje char(100) -+ Titulo a buscar select @titulo = “Pc1e35? ~~ Revisando el niimero de titulos con esa clave select @ocurrencias = ( select count (*) from titles where titles.title id = @titulo) -- Si el titulo con esa clave no existe, se reporta la inexistencia y va a FIN -- Si existe, se muestra el titulo y continia Af @ocurrencias = @ begin select ‘El tilulo ‘ + @titulo + ‘no existe.’ print @mensaje goto FIN end else begin select @nensaje = ‘Titulo:* + (select titles.title from titles where titles.title id = @titulo) print @mensaje end -+ Evallia cuantas ventas hay del titulo select @ocurrencias = (select ‘count (*) from sales where sales.title_id = @titulo) -- Si hay més de una venta, muestra las ventas. -- De lo contrario, sugiere el uso de otra clave if @ocurrencias > @ begin print ‘Se encontraron ventas del titulo’ select sales.ord_num, sales.qty, sales.title id from sales where sales.title_s Gtitulo ‘end, else begin print ‘No se encontraron ocurrencias? print ‘Intente otro titulo? sos temas se demostraraneneerias de cop subsecuents.

También podría gustarte