valor vai esta zerado de proposito.INSERT INTO TBMOVIMENTODIARIO (TP_MOVIMENTO, NR_DOCUMENTO, VR_MOVIMENTO, DTH_MOVIMENTO, ST_MOVIMENTO)VALUES ('S',123,0,getdate(),'A')INSERT INTO TBMOVIMENTODIARIO (TP_MOVIMENTO, NR_DOCUMENTO, VR_MOVIMENTO, DTH_MOVIMENTO, ST_MOVIMENTO)VALUES ('S',124,0,getdate(),'A')INSERT INTO TBMOVIMENTODIARIO (TP_MOVIMENTO, NR_DOCUMENTO, VR_MOVIMENTO, DTH_MOVIMENTO, ST_MOVIMENTO)VALUES ('S',125,0,getdate(),'A')INSERT INTO TBMOVIMENTODIARIO (TP_MOVIMENTO, NR_DOCUMENTO, VR_MOVIMENTO, DTH_MOVIMENTO, ST_MOVIMENTO)VALUES ('E',123,0,getdate(),'F')INSERT INTO TBMOVIMENTODIARIO (TP_MOVIMENTO, NR_DOCUMENTO, VR_MOVIMENTO, DTH_MOVIMENTO, ST_MOVIMENTO)VALUES ('T',001,0,getdate(),'C')INSERT INTO TBMOVIMENTODIARIO (TP_MOVIMENTO, NR_DOCUMENTO, VR_MOVIMENTO, DTH_MOVIMENTO, ST_MOVIMENTO)VALUES ('T',002,0,getdate(),'F')INSERT INTO TBMOVIMENTODIARIO (TP_MOVIMENTO, NR_DOCUMENTO, VR_MOVIMENTO, DTH_MOVIMENTO, ST_MOVIMENTO)VALUES ('D',001,0,getdate(),'F')Agora vamos comecar aexemplificar a criacao e execucao de cursores. No comeco de forma bem simples.DECLARE @CD_CATEGORIA INTDECLARE CURSOR_CATEGORIA CURSORFORSELECT CD_CATEGORIA FROM TBCATEGORIAOPEN CURSOR_CATEGORIA;FETCH NEXT FROM CURSOR_CATEGORIAINTO @CD_CATEGORIAWHILE @@FETCH_STATUS = 0BEGIN SELECTCD_SUB, DESC_SUB FROM TBSubCategoria WHERE CD_CATEGORIA = @CD_CATEGORIA FETCHNEXT FROM CURSOR_CATEGORIA INTO@CD_CATEGORIAENDCLOSE CURSOR_CATEGORIADEALLOCATE CURSOR_CATEGORIAO que fizemos foi percorrer todasas categorias e mostrar as subcategorias de acordo com o codigo da categoriainformado.Primeiro declaramos avariavel DECLARE @CD_CATEGORIA INT ,em seguida, declaramos o cursor, DECLARE CURSOR_CATEGORIA CURSOR FOR, e informando que consulta faria partedele. Em seguida abrimos o cursor vamospra primeira posicao e setamos a variavel com o valor do codigo: OPEN CURSOR_CATEGORIA;FETCH NEXT FROM CURSOR_CATEGORIAINTO @CD_CATEGORIAEntaocomecamos a repeticao do cursor com o WHILE e por fim fechamos o cursor edesalocamos ele da memoria:WHILE @@FETCH_STATUS = 0BEGIN SELECTCD_SUB, DESC_SUB FROM TBSubCategoria WHERE CD_CATEGORIA = @CD_CATEGORIA FETCHNEXT FROM CURSOR_CATEGORIA INTO@CD_CATEGORIAENDCLOSE CURSOR_CATEGORIADEALLOCATE CURSOR_CATEGORIAEstee um cursor bem simples, agora vamos complicar um pouco mais, vamos fazer oseguinte, criamos duas tabelas, mas somente carregamos uma delas e com valorigual a zero. O que vamos fazer e preencher a outra tabela de forma aleatoriausando um cursor.--DECLARANDO VARIAVEISDECLARE @CD_MOVIMENTO INT, @CD_PRODUTO INT, @VLR_UNITARIO DECIMAL(10,2), @SOMAVALOR DECIMAL(10,2) SET @SOMAVALOR= 0 --DECLARANDO CURSOR DE MOVIMENTODECLARE CURSOR_MOV CURSOR FORSELECT CD_MOVIMENTO FROM TBMovimentoDiarioOPEN CURSOR_MOV;FETCH NEXT FROM CURSOR_MOVINTO @CD_MOVIMENTOWHILE @@FETCH_STATUS = 0BEGIN --DECLARANDOCURSOR DE PRODUTOS DECLARECURSOR_PROD CURSORFOR SELECTTOP 30 PERCENT P.CD_PRODUTO, E.VLR_UNITARIO FROM TBPRODUTO P INNER JOIN TBESTOQUE E ON E.CD_PRODUTO = P.CD_PRODUTO WHEREP.ST_PRODUTO = 'A' OPENCURSOR_PROD FETCHNEXT FROM CURSOR_PROD INTO@CD_PRODUTO, @VLR_UNITARIO WHILE@@FETCH_STATUS =0 BEGIN --INSERINDO PRODUTOS DO MOVIMENTO INSERT INTO TBMovimentoProduto (CD_MOVIMENTO, CD_PRODUTO, QTD_PRODUTO) VALUES (@CD_MOVIMENTO, @CD_PRODUTO, RAND(10)) SET @SOMAVALOR = @SOMAVALOR + @VLR_UNITARIO FETCH NEXT FROM CURSOR_PROD INTO @CD_PRODUTO, @VLR_UNITARIO END CLOSECURSOR_PROD DEALLOCATECURSOR_PROD --ATUALIZANDOO VALOR DO MOVIMENTO UPDATETBMovimentoDiario SETVR_MOVIMENTO = @SOMAVALOR WHERECD_MOVIMENTO = @CD_MOVIMENTO SET@SOMAVALOR = 0 FETCHNEXT FROM CURSOR_MOV INTO@CD_MOVIMENTOENDCLOSE CURSOR_MOVDEALLOCATE CURSOR_MOVFicouum pouco mais complicado, mas explicando da pra entender. Primeira coisa quefazemos e declarar algumas variaveis que utilizaremos dentro dos cursores,aninhamos dois cursores para fazer a insercao. Em seguida declaramos o primeirocursor para os movimentos gerados e vamos guardar seus codigos. Dentro do lacodeclaramos outro cursor de produtos ativos e guardamos seu codigo e valor.Agora comecamos o segundo laco WHILE, inserindo os produtos com o primeirocodigo de movimento selecionado, um dos produtos selecionado na consulta e umvalor randomico entre 1 e 10 para quantidade. Acumulamos o valor do movimentoem uma variavel e assim e feito ate todos os produtos consultados serem lidos.Saimos do segundo laco, entao atualizamos o valor em nossa tabela de movimentode acordo com o movimento e valor acumulado, zeramos a tabela e comeca oprocesso novamente ate todos os movimentos consultados serem lidos.Nofinal da execucao as duas tabelas estarao preenchidas e devidamenteatualizadas. Achou complicado? Acredito que nao.Grande abraco e ate breve. Artigos anteriores:Desvendando o SQL - Parte I