{"id":400,"date":"2017-09-19T21:55:08","date_gmt":"2017-09-19T21:55:08","guid":{"rendered":"http:\/\/www.manualsqlserver.com\/?p=400"},"modified":"2020-07-17T15:46:23","modified_gmt":"2020-07-17T15:46:23","slug":"cursores-casos-practicos","status":"publish","type":"post","link":"https:\/\/manualsqlserver.com\/?p=400","title":{"rendered":"Cursores en SQL Server &#8211; Casos pr\u00e1cticos"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_CursoresEjerciciosD.png\" alt=\"\" class=\"wp-image-1018\" width=\"248\" height=\"170\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Cursores<\/strong><\/h2>\n\n\n\n<p>Elemento que almacena en memoria el resultado de un Select. Para mayor informaci\u00f3n ver <a href=\"http:\/\/www.manualsqlserver.com\/?p=343\">Cursores en SQL Server<\/a><\/p>\n\n\n\n<p>Pasos:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Declarar el cursor, utilizando DECLARE<\/li><li>Abrir el cursor, utilizando OPEN<\/li><li>Leer los datos del cursor, utilizando FETCH &#8230; INTO<\/li><li>Cerrar el cursor, utilizando CLOSE<\/li><li>Liberar el cursor, utilizando DEALLOCATE<\/li><\/ol>\n\n\n\n<!--more-->\n\n\n\n<script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-2636008503986218\"\n     data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<p>Las sintaxis de las instrucciones es como sigue:<\/p>\n\n\n\n<p>DECLARE &lt;NOMBRE_CURSOR&gt; CURSOR FOR &lt;SENTENCIA_SQL&gt;<\/p>\n\n\n\n<p>OPEN &lt;NOMBRE_CURSOR&gt;<\/p>\n\n\n\n<p>FETCH &lt;NOMBRE_CURSOR&gt; INTO &lt;LISTA_VARIABLES&gt;<\/p>\n\n\n\n<p>WHILE (@@FETCH_STATUS = 0)<br>BEGIN<br>FETCH &lt;NOMBRE_CURSOR&gt; INTO &lt;LISTA_VARIABLES&gt;<br>&#8230;<br>END &#8212; FIN DEL BUCLE WHILE<\/p>\n\n\n\n<p>CLOSE &lt;NOMBRE_CURSOR&gt;<\/p>\n\n\n\n<p>DEALLOCATE &lt;NOMBRE_CURSOR&gt;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ejercicios<\/h3>\n\n\n\n<p>Cursor que liste las categorias, el resultado se muestra como sigue:<br>1 Beverages<br>2 Condiments<br>3 Confections<br>4 Dairy Products<br>5 Grains\/Cereals<br>6 Meat\/Poultry<br>7 Produce<br>8 Seafood *\/<\/p>\n\n\n\n<p><strong>Crear y mostrar los resultados manualmente.<\/strong><br>Declare cursorCategorias Cursor for select CategoryID, CategoryName from Categories<br>go<br><strong>Abrir<\/strong><br>Open cursorCategorias<br>go<br><strong>Para mostrar las categor\u00edas usar la siguiente instrucci\u00f3n, repetir hasta terminar el listado.<\/strong><br>Fetch cursorCategorias<br>go<br>select @@FETCH_STATUS &#8212; 0 cuando existen registros por leer, -1 cuando ya no existen registros<br>go<br><strong>Cerrar el cursor<\/strong><br>close cursorCategorias<br><strong>Liberar el cursor de la memoria.<\/strong><br>Deallocate cursorCategorias<br>go<\/p>\n\n\n\n<p><strong>Listado autom\u00e1tico usando While y variables<\/strong><\/p>\n\n\n\n<p>Declare cursorCategorias Cursor for select CategoryID, CategoryName from Categories<br>Open cursorCategorias<br>Declare @CodigoCategoria int, @NombreCategoria nvarchar(15)<br>Fetch cursorCategorias into @CodigoCategoria, @NombreCategoria<br>WHILE (@@FETCH_STATUS = 0)<br>BEGIN<br>Print &#8216;C\u00f3digo: &#8216; + Ltrim(Str(@CodigoCategoria)) + Space(2)<br>+ &#8216;Nombre: &#8216; + @NombreCategoria<br>Fetch cursorCategorias into @CodigoCategoria, @NombreCategoria<br>END &#8212; FIN DEL BUCLE WHILE<br>CLOSE cursorCategorias<br>DEALLOCATE cursorCategorias<br>go<\/p>\n\n\n\n<p>El resultado se muestra en la imagen.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_CursoresEjercicios01.png\" alt=\"\" class=\"wp-image-1016\" width=\"753\" height=\"337\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_CursoresEjercicios01.png 584w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_CursoresEjercicios01-300x134.png 300w\" sizes=\"auto, (max-width: 753px) 100vw, 753px\" \/><\/figure><\/div>\n\n\n\n<p><strong>En el ejemplo siguiente, actualizamos el precio de los productos: si su stock es mayor<\/strong><br><strong>o igual a 1000, se descuenta el precio al 50%, sino se descuenta el precio al 20%.&nbsp;<\/strong><\/p>\n\n\n\n<p><strong>DECLARACI\u00d3N DEL CURSOR DE ACTUALIZACION<\/strong><\/p>\n\n\n\n<p>DECLARE ActualizaPreciosProductos CURSOR FOR<br>SELECT ProductID, ProductName, UnitPrice, UnitsInStock FROM Products<br><strong>FOR UPDATE<\/strong><br><strong>&#8212; APERTURA DEL CURSOR<\/strong><br>OPEN ActualizaPreciosProductos<br><strong>&#8212; DECLARACION DE VARIABLES PARA EL CURSOR<\/strong><br>DECLARE @ID INT, @NOMBRE VARCHAR(255), @PRECIO DECIMAL, @StockActual INT<br><strong>&#8212; LECTURA DE LA PRIMERA FILA DEL CURSOR<\/strong><br>FETCH ActualizaPreciosProductos INTO @ID, @NOMBRE, @PRECIO, @StockActual<br><strong>&#8212; MIENTRAS PUEDA LEER EL REGIStockActualRO<\/strong><br>WHILE (@@FETCH_Status = 0 )<br>BEGIN<br>IF(@StockActual>=100)<br>Begin<br>SET @PRECIO = 0.5*@PRECIO<br>End<br>ELSE<br>Begin<br>SET @PRECIO = 0.80*@PRECIO<br>End<br>UPDATE Products SET UnitPrice = @PRECIO<br>WHERE CURRENT OF ActualizaPreciosProductos<br><strong>&#8211;IMPRIMIR<\/strong><br>PRINT &#8216;EL PRECIO DE PRODUCTO &#8216;+ @NOMBRE+ &#8216; ES &#8216; + Str(@PRECIO)<br><strong>&#8212; LECTURA DE LA SIGUIENTE FILA DEL CURSOR<\/strong><br>FETCH ActualizaPreciosProductos INTO @ID, @NOMBRE, @PRECIO, @StockActual<br>END<br><strong>&#8212; CIERRE DEL CURSOR<\/strong><br>CLOSE ActualizaPreciosProductos<br><strong>&#8212; LIBERAR LOS RECURSOS<\/strong><br>DEALLOCATE ActualizaPreciosProductos<br>go<\/p>\n\n\n\n<script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-2636008503986218\"\n     data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<p><strong>CURSORES ANIDADOS<\/strong><br><strong>Cursor que muestre las categor\u00edas y de cada categor\u00eda los productos<\/strong><\/p>\n\n\n\n<p>Declare cursorCategorias cursor for select CategoryID, CategoryName from Categories<br>Open cursorCategorias<br>Declare @CodigoCategoria int, @NombreCategoria nvarchar(15)<br>Fetch cursorCategorias into @CodigoCategoria, @NombreCategoria<br>While (@@FETCH_STATUS = 0)<br>Begin<br>Print &#8216;=========================================================================================&#8217;<br>Print &#8216;C\u00f3digo: &#8216; + Ltrim(Str(@CodigoCategoria)) + Space(3) + &#8216; Categoria: &#8216; + @NombreCategoria<br>Print &#8216;=========================================================================================&#8217;<br>&#8212; Crear el cursor para leer los productos de la categor\u00eda actual<br>Declare cursorProductosPorCategoria cursor for<br>select ProductID, ProductName, UnitPrice from Products where CategoryID = @CodigoCategoria<br>Open cursorProductosPorCategoria<br>Declare @CodigoProducto int, @NombreProducto nvarchar(40),@Precio Decimal<br>Fetch cursorProductosPorCategoria into @CodigoProducto , @NombreProducto ,@Precio<br>While (@@FETCH_STATUS = 0)<br>Begin<br>Print &#8216;C\u00f3digo: &#8216; + Ltrim(Str(@CodigoProducto)) + Space (3) + &#8216;Descripci\u00f3n: &#8216; + @NombreProducto<br>Fetch cursorProductosPorCategoria into @CodigoProducto , @NombreProducto ,@Precio<br>End<br>Close cursorProductosPorCategoria<br>Deallocate cursorProductosPorCategoria<br>Fetch cursorCategorias into @CodigoCategoria, @NombreCategoria<br>End<br>close cursorCategorias<br>Deallocate cursorCategorias<br>go<\/p>\n\n\n\n<p>El resultado con las dos primeras categor\u00edas y sus productos se muestran en la imagen siguiente:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_CursoresEjercicios02.png\" alt=\"\" class=\"wp-image-1017\" width=\"804\" height=\"585\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_CursoresEjercicios02.png 654w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/05\/ManualSQL_CursoresEjercicios02-300x218.png 300w\" sizes=\"auto, (max-width: 804px) 100vw, 804px\" \/><\/figure><\/div>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Cursor Scroll:&nbsp;<\/strong><\/h3>\n\n\n\n<p>Para leer los datos del cursor definido como Scroll, en la instrucci\u00f3n Fetch se puede usar las siguientes palabras para desplazarse.<\/p>\n\n\n\n<p><strong>&#8212; First &#8211; Primer registro<\/strong><br><strong>&#8212; Last &#8211; \u00daltimo registro<\/strong><br><strong>&#8212; Next &#8211; Siguiente Registro<\/strong><br><strong>&#8212; Prior &#8211; Registro Anterior<\/strong><br><strong>&#8212; Relative n &#8211; Positivo Avanza n<\/strong><br><strong>&#8212; Negativo Retrocede n<\/strong><br><strong>&#8212; Absolute n &#8211; Registro n<\/strong><\/p>\n\n\n\n<p><strong>&#8212; NO OLVIDAR USAR LA CLAUSULA&#8230;. FROM<\/strong><\/p>\n\n\n\n<p><strong>&#8212; Crear un cursor Scroll con las categorias<\/strong><br>Declare cursorScrollCategorias Scroll Cursor for select * from Categories<br>Open cursorScrollCategorias<br>go<br><strong>&#8212; Reci\u00e9n abierto&#8230; la siguiente instrucci\u00f3n lee el primer registro<\/strong><br>Fetch cursorScrollCategorias<br>go<br><strong>&#8212; Primero<\/strong><br>Fetch First from cursorScrollCategorias<br>go<\/p>\n\n\n\n<p><strong>&#8212; \u00daltimo<\/strong><br>Fetch Last from cursorScrollCategorias<br>go<br><strong>&#8212; Retroceder 3<\/strong><br>Fetch Relative -3 from cursorScrollCategorias<br>go<\/p>\n\n\n\n<p><strong>&#8212; Al n\u00famero 6<\/strong><br>Fetch Absolute 6 from cursorScrollCategorias<br>go<br><strong>&#8212; Siguiente<\/strong><br>Fetch next from cursorScrollCategorias<br>go<br><strong>&#8212; Anterior<\/strong><br>Fetch prior from cursorScrollCategorias<br>go<br><strong>&#8212; Cerrar y liberar<\/strong><br>Close cursorScrollCategorias<br>Deallocate cursorScrollCategorias<br>go<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cursores Elemento que almacena en memoria el resultado de un Select. Para mayor informaci\u00f3n ver Cursores en SQL Server Pasos: Declarar el cursor, utilizando DECLARE Abrir el cursor, utilizando OPEN Leer los datos del cursor, utilizando FETCH &#8230; INTO Cerrar el cursor, utilizando CLOSE Liberar el cursor, utilizando DEALLOCATE<\/p><p><a class=\"more-link btn\" href=\"https:\/\/manualsqlserver.com\/?p=400\">Seguir leyendo<\/a><\/p>\n","protected":false},"author":1,"featured_media":1018,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[232,8],"tags":[70,72,73,53],"class_list":["post-400","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cursoressql","category-programacion","tag-cursor","tag-cursores-sql-server","tag-declare-cursor","tag-sqlserver","nodate","item-wrap"],"_links":{"self":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/400","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=400"}],"version-history":[{"count":1,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/400\/revisions"}],"predecessor-version":[{"id":1019,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/400\/revisions\/1019"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/media\/1018"}],"wp:attachment":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=400"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=400"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=400"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}