a dificuldade na execucao daPROCEDURE, mas com um banco com varios usuarios as procedures somente seraoexecutadas com permissao.Execucao Para uma procedure ser executadacolocamos os comandos EXECUTE ou EXEC antes do nome da PROCEDURE:EXECUTE <@Param1, @Param2,...>GO-- OrEXEC <@Param1, @Param2,...>GOEXEMPLOSMostraremos agora alguns exemplosde criacao e execucao de procedures, a principio sem parametros e em seguidavamos incluindo alguns parametros e algumas outras opcoes de acordo com o queja vimos nos artigos anteriores.Criando um procedimento simples;CREATE PROCEDURE PRProduto ASBEGINSELECT CD_REFERENCIA, DESC_PRODUTO, ST_PRODUTO, NR_SERIE FROM TBPRODUTOENDGOPara executar e so digitar ocomando abaixo: EXECUTE PRProdutoMais de um conjunto de resultados;CREATE PROCEDURE PRProdutoCategoria ASBEGIN SELECT CD_REFERENCIA, DESC_PRODUTO,ST_PRODUTO, NR_SERIE FROM TBPRODUTOSELECT P.DESC_PRODUTO, C.DESC_CATEGORIA, S.DESC_SUBFROM TBPRODUTO AS P INNER JOIN TBSUBCATEGORIA AS S ON S.CD_SUB = P.CD_SUB INNER JOIN TBCATEGORIA AS C ON C.CD_CATEGORIA = S.CD_CATEGORIAWHERE C.DESC_CATEGORIA = 'BEBIDAS'ENDGORelatorio de produtos. Lembra quando fizemos umcursor que mostrava um relatorio com os produtos dos movimentos fechados? Agoravamos criar uma procedure para executar esse relatorio sempre que necessario,so que agora passando alguns parametros.CREATE PROCEDURE PRRelatProdMovimento (@ST_MOV CHAR(1), @DT_INIMOV DATETIME, @DT_FINMOV DATETIME) ASBEGIN --O EXEMPLO ASEGUIR MOSTRA COMO CURSORES PODEM SER ANINHADOS PARA PRODUZIR RELATORIOSCOMPLEXOS. O CURSOR INTERNO E DECLARADO PARA CADA PRODUTO. SET NOCOUNT ON; DECLARE @CD_MOVIMENTO INT, @DESC_PRODUTO VARCHAR(50), @MENSAGEM VARCHAR(200), @TP_MOVIMENTO CHAR(1), @NR_DOCUMENTO INT, @QTD DECIMAL(10,4), @UNIDADE VARCHAR(5) PRINT '-------- RELATORIO DE PRODUTOS DO MOVIMENTO --------'; DECLAREMOV_CURSOR CURSOR FOR SELECTCD_MOVIMENTO, TP_MOVIMENTO, NR_DOCUMENTO FROM TBMOVIMENTODIARIO WHERE ST_MOVIMENTO= @ST_MOV AND DTH_MOVIMENTOBETWEEN @DT_INIMOV AND@DT_FINMOV ORDER BY TP_MOVIMENTO; OPEN MOV_CURSOR FETCH NEXT FROM MOV_CURSOR INTO @CD_MOVIMENTO,@TP_MOVIMENTO, @NR_DOCUMENTO WHILE @@FETCH_STATUS= 0 BEGIN PRINT ' ' SELECT @MENSAGEM = '----- PRODUTOS DOMOVIMENTO: ' + @NR_DOCUMENTO + ' - ' + CASE@TP_MOVIMENTO --(E - ENTRADA, S - SAIDA, T -TRANSFERENCIA, D - DEVOLUCAO) WHEN 'E'THEN 'ENTRADA' WHEN 'S' THEN 'SAIDA' WHEN 'T' THEN 'TRANSFERENCIA' WHEN 'D' THEN 'DEVOLUCAO' END PRINT @MENSAGEM -- DECLARE AN INNER CURSOR BASED -- ON VENDOR_ID FROM THE OUTER CURSOR. DECLARE PROD_CURSOR CURSOR FOR SELECTP.DESC_PRODUTO,M.QTD_PRODUTO,U.SGL_UNIDADE FROM TBMOVIMENTOPRODUTOM INNER JOIN TBPRODUTOP ON P.CD_PRODUTO= M.CD_PRODUTO INNER JOIN TBUNIDADE U ON U.CD_UNIDADE = M.CD_UNIDADE WHEREM.CD_MOVIMENTO =@CD_MOVIMENTO OPENPROD_CURSOR FETCH NEXTFROM PROD_CURSOR INTO @DESC_PRODUTO,@QTD, @UNIDADE IF @@FETCH_STATUS <> 0 PRINT ' <>' WHILE @@FETCH_STATUS= 0 BEGIN SELECT @MENSAGEM = ' ' + @DESC_PRODUTO + ' - ' + CAST(@QTD AS VARCHAR(10)) + '-' + @UNIDADE PRINT @MENSAGEM FETCH NEXT FROM PROD_CURSOR INTO @DESC_PRODUTO,@QTD, @UNIDADE END CLOSE PROD_CURSOR DEALLOCATE PROD_CURSOR -- GET THE NEXT VENDOR. FETCH NEXT FROM MOV_CURSOR INTO @CD_MOVIMENTO,@TP_MOVIMENTO, @NR_DOCUMENTO END CLOSE MOV_CURSOR; DEALLOCATE MOV_CURSOR;ENDEssa e somente uma das muitasutilidades das Procedures, e bem interessante quando temos processos pesados equeremos tirar isso de nossa aplicacao e joga-la no servidor. Nem sempreprecisando devolver um resultado, podemos usa-la somente pra executarprocedimentos. Tente tambem fazer outrasprocedures com outros processamentos que deseje, e caso tenha alguma duvida, eso comentar que terei o prazer de responder. No proximo artigo falaremos umpouco sobre as FUNCTION ou Funcoes no SQL. Nao perca.Ate a proxima.Artigos anteriores:Desvendando o SQL - Parte I - IntroducaoDesvendando o SQL - Parte II - Criando um Banco de Dados e TabelasDesvendando o SQL - Parte III - Alterando RegistrosDesvendando o SQL - Parte IV - ConsultasDesvendando o SQL - Parte V