none
Uma procedure chamando ela mesmo dentro dela com outro cursor - Recursividade RRS feed

  • Pergunta

  • Eu tenho uma procedure que dentro dela, chama ela mesmo mais com outro cursor..

    Foi criado um cursor dinamico, pois estava dando erro, ele reclamava que tinha dois..

    Agora quando exevuta da um erro

    Must declare the scalar variable "@nCD_AST_NIVEL_ATUAL".

    Mais só da erro quando chama o fetch, porque antes ele recebe valor = 0

    ALTER PROCEDURE USP_TESTE_RECURSIVIDADE(@nCD_AST SMALLINT = NULL, 
       				  @nNIVEL SMALLINT = 0)AS 
    
    DECLARE @sCOMANDO VARCHAR(200), @nCD_AST_NIVEL_ATUAL SMALLINT, 
     @sNOME_CURSOR VARCHAR(50)
    
    SET @sNOME_CURSOR = 'CURSOR_CSU_ASSUNTO_' + CAST(@nCD_AST AS VARCHAR) 
    
    SET @sCOMANDO = 'DECLARE ' + @sNOME_CURSOR + ' CURSOR FOR 
    
    
     SELECT CD_AST 
     FROM TGSAST 
     WHERE CD_AST_DPD = ' + CAST(@nCD_AST AS VARCHAR) 
    
    IF @nNIVEL = 0 BEGIN 
    
     CREATE TABLE ##TAB_SGS_CSU_ASSUNTO (CD_AST SMALLINT, DC_AST VARCHAR(80), CD_AST_DPD SMALLINT) 
    
     INSERT INTO ##TAB_SGS_CSU_ASSUNTO (CD_AST, DC_AST, CD_AST_DPD) 
    
     SELECT CD_AST, DC_AST, CD_AST_DPD 
    
     FROM TGSAST 
    
     WHERE CD_AST = @nCD_AST 
    
    END 
    
    EXEC(@sCOMANDO) 
    
    SET @sCOMANDO = 'OPEN ' + @sNOME_CURSOR 
    
    EXEC(@sCOMANDO) 
    
    SET @nCD_AST_NIVEL_ATUAL = 0 
    
    PRINT ' NIVEL ' + CAST(@nNIVEL AS VARCHAR) + ' @nCD_AST_NIVEL_ATUAL --> ' + CAST(@nCD_AST_NIVEL_ATUAL AS VARCHAR) 
    
    SET @sCOMANDO = 'FETCH NEXT FROM ' + @sNOME_CURSOR + ' INTO @nCD_AST_NIVEL_ATUAL' 
    
    EXEC(@sCOMANDO) 
    
    PRINT ' NIVEL ' + CAST(@nNIVEL AS VARCHAR) + ' @nCD_AST_NIVEL_ATUAL --> ' + CAST(@nCD_AST_NIVEL_ATUAL AS VARCHAR) 
    
    WHILE @@FETCH_STATUS = 0 BEGIN 
    
     INSERT INTO ##TAB_SGS_CSU_ASSUNTO (CD_AST, DC_AST, CD_AST_DPD) 
    
     SELECT CD_AST, DC_AST, CD_AST_DPD
    
     FROM TGSAST
     WHERE CD_AST = @nCD_AST_NIVEL_ATUAL 
    
    --INCREMENTANDO NÍVEL ANTES DE CHAMAR A PROCEDURE 
     SET @nNIVEL = @nNIVEL + 1 
    
    --BUSCANDO TODOS OS ASSUNTOS DEPENDENTES DE UM ASSUNTO 
    
    PRINT ' NIVEL ' + CAST(@nNIVEL AS VARCHAR) + ' @nCD_AST_NIVEL_ATUAL --> ' + CAST(@nCD_AST_NIVEL_ATUAL AS VARCHAR) 
    
     EXEC USP_TESTE_RECURSIVIDADE @nCD_AST_NIVEL_ATUAL, @nNIVEL 
    
     SET @sCOMANDO = 'FETCH NEXT FROM ' + @sNOME_CURSOR + ' INTO @nCD_AST_NIVEL_ATUAL' 
    
     EXEC(@sCOMANDO) 
    
    END 
    
    SET @sCOMANDO = 'CLOSE ' + @sNOME_CURSOR 
    EXEC(@sCOMANDO) 
    
    SET @sCOMANDO = 'DEALLOCATE ' + @sNOME_CURSOR 
    
    EXEC(@sCOMANDO) 
    
    IF @nNIVEL = 0 BEGIN 
    
     SELECT * FROM ##TAB_SGS_CSU_ASSUNTO 
    
     DROP TABLE ##TAB_SGS_CSU_ASSUNTO 
    
    END 
    
    --EXEC USP_TESTE_RECURSIVIDADE 8,0 
    
    --SELECT * FROM TGSAST 
    
    --DEALLOCATE CURSOR_CSU_ASSUNTO_8
    
    

    Se puderem ajudar, estou precisando disso pra listar uma tabela de assuntos, que tem assuntos pai e dependentes.. Tenho que montar para mostrar numa TreeView.
    Att,




    terça-feira, 23 de agosto de 2011 12:32

Respostas

Todas as Respostas

  • Diego

    este código esta um pouco confuso... qual a versão de seu sql, pelo que estou entendo vc esta tentando fazer uma query recursiva... poderia exemplificar sua necessidade pois acredito que a CTE recursiva pode te ajudar


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    terça-feira, 23 de agosto de 2011 12:57
  • Olá Marcelo,

    A versão minha é 2005.

    Então estou querenco chamar dois cursor e eles chamam a mesma procedure.. isso é para montar

    os niveis de uma arvore..

    Eu tenho uma Tabela Assunto que tem o Assunto pai e os filhos.. Tenho que montar os niveis então!

    Se você tiver um exemplo de dois cursor em uma procedure chamando ela mesmo, ou um exemplo de CTE para esse tipo de problema que estou, ajudaria..

    terça-feira, 23 de agosto de 2011 13:10
  • este exemplo do Catae deverá de ajudar...

    http://blogs.msdn.com/b/fcatae/archive/2010/11/10/query-recursiva.aspx


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    terça-feira, 23 de agosto de 2011 13:55