Hoje estamos novamente com voces,para completar o assunto iniciado artigo passado, onde falamos de Instrucoescondicionais e de repeticao. Na oportunidade mostramos o funcionamento do IF,CASE, quando tratamos lacos condicionais, e do WHILE falando sobre laco derepeticao. Mas existe outro laco de repeticao que e o CURSOR, e sobre esseassunto que vamos tratar nesse artigo. Boa leitura.Os cursores sao consideradostambem um laco de repeticao por sua caracteristica de percorrer repetidamente oresultado de uma consulta, mas somente quando usando dentro deste um WHILEusando um @@FETCH_STATUSque caracteriza a sua repeticao.SintaxeDECLARE nome_cursor [ INSENSITIVE ][ SCROLL ] CURSOR FORconsulta [FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ][;]Transact-SQLExtended SyntaxDECLARE nome_cursor CURSOR [ LOCAL | GLOBAL ] [FORWARD_ONLY | SCROLL ] [STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] [READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] [TYPE_WARNING ] FORselect_statement [FOR UPDATE [ OF column_name [ ,...n ] ] ][;]Para melhor exemplificar o uso decursores vamos criar mais duas tabelas em nosso banco de dados, uma demovimentos que vai registrar os movimentos diarios e outras dos produtos queforam movimentados no dia. Caso tenha comecado a ver o artigo agora, os scriptsde criacao de banco e tabela estao na parte II, bem como algumas alteracoes quefizemos no banco. Vamos por a mao na massa.Primeiro a tabela de movimentos,vamos colocar um codigo, o tipo do movimento, o numero do documento, casoexista, o valor do movimento, a data/hora do movimento e o status. Segue oscript. --CATEGORIA DE PRODUTOSCREATE TABLE TBMovimentoDiario( CD_MOVIMENTO INT NOTNULL identity, TP_MOVIMENTO CHAR(1) CHECK (TP_MOVIMENTO IN ('E','S','T','D')) NOT NULL, --(E - ENTRADA, S - SAIDA, T - TRANSFERENCIA, D -DEVOLUCAO) NR_DOCUMENTO INT NULL, VR_MOVIMENTO DECIMAL(10,2) NOT NULL, DTH_MOVIMENTO DATETIME NOT NULL, ST_MOVIMENTO CHAR(1) CHECK (ST_MOVIMENTO IN ('A','F','C')) NOT NULL --(A - ABERTO, F- FECHADO, C - CANCELADO))EXECUTE SP_ADDEXTENDEDPROPERTY 'MS_DESCRIPTION', 'Tabelade Movimentos Diario', 'USER', 'DBO', 'TABLE', 'TBMovimentoDiario'GOEXECUTE SP_ADDEXTENDEDPROPERTY 'MS_DESCRIPTION', 'Tipodo Movimento. Valores Possiveis ( E - ENTRADA, S - SAIDA, T -TRANSFERENCIA, D - DEVOLUCAO)', 'USER', 'DBO', 'TABLE', 'TBMovimentoDiario', 'COLUMN', 'TP_MOVIMENTO'GOEXECUTE SP_ADDEXTENDEDPROPERTY 'MS_DESCRIPTION', 'Statusdo Movimento. Valores Possiveis ( A - ABERTO, F - FECHADO, C -CANCELADO)', 'USER', 'DBO', 'TABLE', 'TBMovimentoDiario', 'COLUMN', 'ST_MOVIMENTO'GOALTER TABLE TBMovimentoDiario ADDCONSTRAINT PK_MOVTPRIMARY KEY (CD_MOVIMENTO)GOVeja que nos campos do tipo demovimento e do status incluimos uma restricao, a opcao CHECK verifica o valordo campo no momento da insercao e somente a inclusao dos valores especificados,gerando um erro em caso contrario isso ajuda em nao deixa que seja incluidooutros valores para o campo. E tambem incluimos uma descricao para os camposcom restricao para facilitar o entendimento dos valores.Agora vamos a tabela de produtosdo movimento. Nela somente teremos ocodigo do movimento da tabela anterior, o codigo do produto e a quantidade deprodutos. Colocamos o tipo dessa quantidade como DECIMAL(10,4) paraatender aos diferentes tipos de unidades existentes.--CATEGORIA DE PRODUTOSCREATE TABLE TBMovimentoProduto( CD_MOVPRODUTO INT NOTNULL identity, CD_MOVIMENTO INT NOTNULL, CD_PRODUTO INT NOTNULL, QTD_PRODUTO DECIMAL(10,4) NOT NULL)EXECUTE SP_ADDEXTENDEDPROPERTY 'MS_DESCRIPTION', 'Tabelade Produtos do Movimento Diario', 'USER', 'DBO', 'TABLE', 'TBMovimentoProduto'GOALTER TABLE TBMovimentoProduto ADDCONSTRAINT PK_MOVPPRIMARY KEY (CD_MOVPRODUTO)GOALTER TABLE TBMovimentoProduto ADDCONSTRAINT FK_MOVT_MOVPFOREIGN KEY (CD_MOVIMENTO) REFERENCESTBMovimentoDiario (CD_MOVIMENTO)GOALTER TABLE TBMovimentoProduto ADDCONSTRAINT FK_MOVT_PRODFOREIGN KEY (CD_PRODUTO) REFERENCESTBProduto (CD_PRODUTO)GOAgora vamos inserir algunsmovimentos de forma aleatoria,