none
Declarar CURSOR com parâmetro RRS feed

  • Pergunta

  • Pessoal, tenho o seguinte cursor no ORACLE, e preciso convertê-lo para SQL SERVER.


    Como ficaria, já que o cursor abaixo, recebe um parâmentro?


    1CURSOR CURSOR1 (DATA DATE) IS 
    2        SELECT * FROM TABELA WHERE TRUNC(DATAINICIAL) <= DATA
    3 

    Obrigado!

    Coordenador de Projetos / DBA
    sexta-feira, 20 de fevereiro de 2009 14:03

Respostas

  • Olá,

    O SQL Server trabalha de maneira diferente. Veja o exemplo abaixo. Você não precisa "passar" uma variável para o cursor, e sim utilizar qualquer variável que tiver sido declarada na sessão.

    --// aqui eu declaro uma (ou várias variáveis), que posso usá-las dentro do cursor  
    DECLARE @variavelDeParametro INT 
    SET @variavelDeParametro = 1  
     
    DECLARE @coluna = INT --// esta variável é utilizada pelo cursor  
     
    DECLARE MyCursor CURSOR FAST_FORWARD FOR --// dependendo do que vc estiver fazendo no seu cursor, esta opção FAST_FORWARD deverá ser alterada
    SELECT Coluna FROM Tabela   
    WHERE Coluna = @variavelDeParametro --// veja que aqui uso a variável declarada lá em cima  
     
    OPEN MyCursor  
    FETCH NEXT FROM MyCursor   
    INTO @coluna  
     
    WHILE @@FETCH_STATUS = 0  
    BEGIN 
     
        --// aqui você usa as informações do cursor para fazer o que precisar  
     
    FETCH NEXT FROM MyCursor   
    INTO @coluna  
    END 
     
    CLOSE MyCursor  
    DEALLOCATE MyCursor 

    Veja se consegue entender e qualquer coisa poste as dúvidas.

    Um abraço,
    Raul Santos Neto
    sexta-feira, 20 de fevereiro de 2009 16:50
  • Ale2009,

    Veja este outro exemplo:

    1 SET ANSI_NULLS ON 
    2 GO  
    3 SET QUOTED_IDENTIFIER ON 
    4 GO  
    5 CREATE Procedure [dbo].[P_RegistroHistorico_ResumoResultadosPVMxMOxMP]  
    6 As 
    7  Begin 
    8  
    9   Set NoCount On 
    10  
    11   Declare @NumControle Char(7),  
    12              @CodSequencialProduto Int,  
    13              @CodRelacionamento Int,  
    14              @CodSigla Char(2)  
    15  
    16   Set @NumControle = 0  
    17   Set @CodSequencialProduto = 0   
    18   Set @CodRelacionamento = 0  
    19  
    20   Declare CTProducao_PVM_Items_Cursor Cursor For    
    21   Select  NUMCONTROLE, CODSIGLA from dbo.CTPRODUCAO_REGISTROHISTORICOPARCIAL_ITENS   
    22   ORDER BY CODSIGLA DESC 
    23   Open CTProducao_PVM_Items_Cursor  
    24  
    25   While @@Fetch_Status = 0  
    26    Begin 
    27     Fetch Next From CTProducao_PVM_Items_Cursor  
    28     Into @NumControle,@CodSigla  
    29  
    30     If (@CodSigla = 'MO')   
    31      Begin 
    32         
    33       Select @CodRelacionamento=CodRelacionamento,  
    34                @CodSequencialProduto=CodSequencialProduto   
    35       From CTProducao_Moinho_Resultados Where NUMMO = @NumControle                   
    36  
    37    If Not Exists(Select NumControle from ResumoResultadosMO Where NumControle = @NumControle And CodSigla='MO')  
    38     Begin 
    39       Insert Into ResumoResultadosMO  
    40       SELECT 'MO',  
    41                  PQCRe.NUMMO,  
    42                  ME.DESCRICAO,  
    43                  CME.CLASSE+' - '+CONVERT(VARCHAR(4),ME.NUMENSAIO) As "CodClasses",   
    44                  DataEntrada=(Select DataEntrada from CTProducao_Moinho_Info_Reprovacao Where NUMMO = PQCRe.NUMMO And NumRetorno = PQCRe.NUMRETORNO),                   
    45                  DataLiberacao=(Select DataLiberacao from CTProducao_Moinho_Info_Reprovacao Where NUMMO = PQCRe.NUMMO And NumRetorno = PQCRe.NUMRETORNO),  
    46                  PQCRe.NUMRETORNO,  
    47                  PQCx.PADRAO_MINIMO,  
    48                  PQCx.PADRAO_MAXIMO,  
    49                  ME.UNIDADE,  
    50                  PQCRe.AMOSTRA,  
    51                  Case PQCRe.STATUS  
    52                   When 'A' Then 'Aprovado' 
    53                   When 'R' Then 'Reprovado' 
    54                  End As Status,  
    55                  PQCRe.MOTIVO_ANALISE,  
    56                  NOME=(SELECT NOME FROM RESPONSAVEL Where Responsavel.Codigo = PQCRe.CodResponsavel_Laboratorio)  
    57       FROM METODOS_ENSAIOS ME INNER JOIN CLASSIFICACAO_ME CME  
    58                                                 ON ME.NUMCLASSE = CME.CODIGO  
    59                                                INNER JOIN PQC_MoinhoxME PQCx  
    60                                                 ON PQCx.CODSEQUENCIALMETODO = ME.CODIGO  
    61                                                INNER JOIN CTPRODUCAO_MOINHO_RESULTADOS PQCRe  
    62                                                 ON PQCRe.NUMMO = @NumControle  
    63                                                 AND PQCRe.CODSEQUENCIALMETODO = ME.CODIGO  
    64       WHERE PQCx.CODSEQUENCIALPRODUTO = @CodSequencialProduto  
    65       AND     PQCx.CODRELACIONAMENTO = @CodRelacionamento        
    66      End      
    67     End 
    68  
    69  If Not Exists(Select NumControle from ResumoResultadosMP Where NumControle = @NumControle And CodSigla='MP')  
    70    Begin 
    71     If (@CodSigla = 'MP'And (SubString(@NumControle,6,2)>='07')   
    72      Begin      
    73        Select @CodRelacionamento=CodRelacionamento,  
    74                 @CodSequencialProduto=CodSequencialProduto   
    75        From CTEntrada_PQC_Resultados Where NUMMP = @NumControle                   
    76  
    77        Insert Into ResumoResultadosMP  
    78        SELECT 'MP',  
    79                   NUMMP,  
    80                   ME.DESCRICAO,  
    81                   CME.CLASSE+' - '+CONVERT(VARCHAR(4),ME.NUMENSAIO) As "CodClasses",   
    82                   PQCx.PADRAO_MINIMO,  
    83                   PQCx.PADRAO_MAXIMO,  
    84                   ME.UNIDADE,  
    85                   PQCRe.AMOSTRA,  
    86                   Observacao=(Select Observacao_Amostra From CTEntrada_PQC Where NumMP = PQCRe.NumMP)  
    87        FROM METODOS_ENSAIOS ME INNER JOIN CLASSIFICACAO_ME CME  
    88                                                  ON ME.NUMCLASSE = CME.CODIGO  
    89                                                 INNER JOIN PQCxME PQCx  
    90                                                  ON PQCx.CODSEQUENCIALMETODO = ME.CODIGO  
    91                                                 INNER JOIN CTENTRADA_PQC_RESULTADOS PQCRe  
    92                                                  ON PQCRe.NUMMP = @NumControle  
    93                                                  AND PQCRe.CODSEQUENCIALMETODO = ME.CODIGO  
    94        WHERE PQCx.CODSEQUENCIALPRODUTO = @CodSequencialProduto  
    95        AND     PQCx.CODRELACIONAMENTO = @CodRelacionamento  
    96       End 
    97  
    98     If (@CodSigla = 'MP'AND (SubString(@NumControle,6,2)='06')  
    99      Begin 
    100         
    101       Select @CodRelacionamento=CodRelacionamento,  
    102                @CodSequencialProduto=CodSequencialProduto   
    103       From CTEntrada_Anterior_PQC_Resultados Where NUMMP = @NumControle                   
    104  
    105       Insert Into ResumoResultadosMP  
    106       SELECT 'MP',  
    107                  PQCRe.NUMMP,  
    108                  ME.DESCRICAO,  
    109                  CME.CLASSE+' - '+CONVERT(VARCHAR(4),ME.NUMENSAIO) As "CodClasses",   
    110                  PQCx.PADRAO_MINIMO,  
    111                  PQCx.PADRAO_MAXIMO,  
    112                  ME.UNIDADE,  
    113                  PQCRe.AMOSTRA,  
    114                  Observacao=(Select Observacao_Amostra From CTEntrada_PQC Where NUMMP = PQCRe.NUMMP)  
    115       FROM METODOS_ENSAIOS ME INNER JOIN CLASSIFICACAO_ME CME  
    116                                                 ON ME.NUMCLASSE = CME.CODIGO  
    117                                                INNER JOIN PQCxME PQCx  
    118                                                 ON PQCx.CODSEQUENCIALMETODO = ME.CODIGO  
    119                                                INNER JOIN CTENTRADA_ANTERIOR_PQC_RESULTADOS PQCRe  
    120                                                 ON PQCRe.NUMMP = @NumControle  
    121                                                 AND PQCRe.CODSEQUENCIALMETODO = ME.CODIGO  
    122       WHERE PQCx.CODSEQUENCIALPRODUTO = @CodSequencialProduto  
    123       AND     PQCx.CODRELACIONAMENTO = @CodRelacionamento  
    124      End 
    125     End 
    126    End 
    127  
    128   CLOSE CTProducao_PVM_Items_Cursor  
    129   DEALLOCATE CTProducao_PVM_Items_Cursor  
    130  End 
    131  
    132  

    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    sexta-feira, 20 de fevereiro de 2009 17:04

Todas as Respostas

  • Olá,

    Como aparentemente você está começando no desenvolvimento em T-SQL, sugiro que utilize a Busca aqui do Fórum, pois muitas das tuas dúvidas serão recorrentes, problemas que outros colegas já tiveram e obtiveram respostas aqui.

    Como a thread a seguir, que trata de cursores e deve te ajudar:

    http://social.msdn.microsoft.com/forums/pt-BR/transactsqlpt/thread/9718900b-f81c-4ad8-96a1-a0df67ee4ece/

    Um abraço,
    Raul Santos Neto
    sexta-feira, 20 de fevereiro de 2009 15:10
  • Fala Raul, valeu pela dica, mas eu preciso passar parametro no cursor, como esta no exemplo que postei anteriormente.

    O link que vc me passou nao tem exemplo de cursor com parametro, se puder me dar um exemplo, ficarei grato!




    Coordenador de Projetos / DBA
    sexta-feira, 20 de fevereiro de 2009 16:22
  • Olá,

    O SQL Server trabalha de maneira diferente. Veja o exemplo abaixo. Você não precisa "passar" uma variável para o cursor, e sim utilizar qualquer variável que tiver sido declarada na sessão.

    --// aqui eu declaro uma (ou várias variáveis), que posso usá-las dentro do cursor  
    DECLARE @variavelDeParametro INT 
    SET @variavelDeParametro = 1  
     
    DECLARE @coluna = INT --// esta variável é utilizada pelo cursor  
     
    DECLARE MyCursor CURSOR FAST_FORWARD FOR --// dependendo do que vc estiver fazendo no seu cursor, esta opção FAST_FORWARD deverá ser alterada
    SELECT Coluna FROM Tabela   
    WHERE Coluna = @variavelDeParametro --// veja que aqui uso a variável declarada lá em cima  
     
    OPEN MyCursor  
    FETCH NEXT FROM MyCursor   
    INTO @coluna  
     
    WHILE @@FETCH_STATUS = 0  
    BEGIN 
     
        --// aqui você usa as informações do cursor para fazer o que precisar  
     
    FETCH NEXT FROM MyCursor   
    INTO @coluna  
    END 
     
    CLOSE MyCursor  
    DEALLOCATE MyCursor 

    Veja se consegue entender e qualquer coisa poste as dúvidas.

    Um abraço,
    Raul Santos Neto
    sexta-feira, 20 de fevereiro de 2009 16:50
  • Ale2009,

    Veja este outro exemplo:

    1 SET ANSI_NULLS ON 
    2 GO  
    3 SET QUOTED_IDENTIFIER ON 
    4 GO  
    5 CREATE Procedure [dbo].[P_RegistroHistorico_ResumoResultadosPVMxMOxMP]  
    6 As 
    7  Begin 
    8  
    9   Set NoCount On 
    10  
    11   Declare @NumControle Char(7),  
    12              @CodSequencialProduto Int,  
    13              @CodRelacionamento Int,  
    14              @CodSigla Char(2)  
    15  
    16   Set @NumControle = 0  
    17   Set @CodSequencialProduto = 0   
    18   Set @CodRelacionamento = 0  
    19  
    20   Declare CTProducao_PVM_Items_Cursor Cursor For    
    21   Select  NUMCONTROLE, CODSIGLA from dbo.CTPRODUCAO_REGISTROHISTORICOPARCIAL_ITENS   
    22   ORDER BY CODSIGLA DESC 
    23   Open CTProducao_PVM_Items_Cursor  
    24  
    25   While @@Fetch_Status = 0  
    26    Begin 
    27     Fetch Next From CTProducao_PVM_Items_Cursor  
    28     Into @NumControle,@CodSigla  
    29  
    30     If (@CodSigla = 'MO')   
    31      Begin 
    32         
    33       Select @CodRelacionamento=CodRelacionamento,  
    34                @CodSequencialProduto=CodSequencialProduto   
    35       From CTProducao_Moinho_Resultados Where NUMMO = @NumControle                   
    36  
    37    If Not Exists(Select NumControle from ResumoResultadosMO Where NumControle = @NumControle And CodSigla='MO')  
    38     Begin 
    39       Insert Into ResumoResultadosMO  
    40       SELECT 'MO',  
    41                  PQCRe.NUMMO,  
    42                  ME.DESCRICAO,  
    43                  CME.CLASSE+' - '+CONVERT(VARCHAR(4),ME.NUMENSAIO) As "CodClasses",   
    44                  DataEntrada=(Select DataEntrada from CTProducao_Moinho_Info_Reprovacao Where NUMMO = PQCRe.NUMMO And NumRetorno = PQCRe.NUMRETORNO),                   
    45                  DataLiberacao=(Select DataLiberacao from CTProducao_Moinho_Info_Reprovacao Where NUMMO = PQCRe.NUMMO And NumRetorno = PQCRe.NUMRETORNO),  
    46                  PQCRe.NUMRETORNO,  
    47                  PQCx.PADRAO_MINIMO,  
    48                  PQCx.PADRAO_MAXIMO,  
    49                  ME.UNIDADE,  
    50                  PQCRe.AMOSTRA,  
    51                  Case PQCRe.STATUS  
    52                   When 'A' Then 'Aprovado' 
    53                   When 'R' Then 'Reprovado' 
    54                  End As Status,  
    55                  PQCRe.MOTIVO_ANALISE,  
    56                  NOME=(SELECT NOME FROM RESPONSAVEL Where Responsavel.Codigo = PQCRe.CodResponsavel_Laboratorio)  
    57       FROM METODOS_ENSAIOS ME INNER JOIN CLASSIFICACAO_ME CME  
    58                                                 ON ME.NUMCLASSE = CME.CODIGO  
    59                                                INNER JOIN PQC_MoinhoxME PQCx  
    60                                                 ON PQCx.CODSEQUENCIALMETODO = ME.CODIGO  
    61                                                INNER JOIN CTPRODUCAO_MOINHO_RESULTADOS PQCRe  
    62                                                 ON PQCRe.NUMMO = @NumControle  
    63                                                 AND PQCRe.CODSEQUENCIALMETODO = ME.CODIGO  
    64       WHERE PQCx.CODSEQUENCIALPRODUTO = @CodSequencialProduto  
    65       AND     PQCx.CODRELACIONAMENTO = @CodRelacionamento        
    66      End      
    67     End 
    68  
    69  If Not Exists(Select NumControle from ResumoResultadosMP Where NumControle = @NumControle And CodSigla='MP')  
    70    Begin 
    71     If (@CodSigla = 'MP'And (SubString(@NumControle,6,2)>='07')   
    72      Begin      
    73        Select @CodRelacionamento=CodRelacionamento,  
    74                 @CodSequencialProduto=CodSequencialProduto   
    75        From CTEntrada_PQC_Resultados Where NUMMP = @NumControle                   
    76  
    77        Insert Into ResumoResultadosMP  
    78        SELECT 'MP',  
    79                   NUMMP,  
    80                   ME.DESCRICAO,  
    81                   CME.CLASSE+' - '+CONVERT(VARCHAR(4),ME.NUMENSAIO) As "CodClasses",   
    82                   PQCx.PADRAO_MINIMO,  
    83                   PQCx.PADRAO_MAXIMO,  
    84                   ME.UNIDADE,  
    85                   PQCRe.AMOSTRA,  
    86                   Observacao=(Select Observacao_Amostra From CTEntrada_PQC Where NumMP = PQCRe.NumMP)  
    87        FROM METODOS_ENSAIOS ME INNER JOIN CLASSIFICACAO_ME CME  
    88                                                  ON ME.NUMCLASSE = CME.CODIGO  
    89                                                 INNER JOIN PQCxME PQCx  
    90                                                  ON PQCx.CODSEQUENCIALMETODO = ME.CODIGO  
    91                                                 INNER JOIN CTENTRADA_PQC_RESULTADOS PQCRe  
    92                                                  ON PQCRe.NUMMP = @NumControle  
    93                                                  AND PQCRe.CODSEQUENCIALMETODO = ME.CODIGO  
    94        WHERE PQCx.CODSEQUENCIALPRODUTO = @CodSequencialProduto  
    95        AND     PQCx.CODRELACIONAMENTO = @CodRelacionamento  
    96       End 
    97  
    98     If (@CodSigla = 'MP'AND (SubString(@NumControle,6,2)='06')  
    99      Begin 
    100         
    101       Select @CodRelacionamento=CodRelacionamento,  
    102                @CodSequencialProduto=CodSequencialProduto   
    103       From CTEntrada_Anterior_PQC_Resultados Where NUMMP = @NumControle                   
    104  
    105       Insert Into ResumoResultadosMP  
    106       SELECT 'MP',  
    107                  PQCRe.NUMMP,  
    108                  ME.DESCRICAO,  
    109                  CME.CLASSE+' - '+CONVERT(VARCHAR(4),ME.NUMENSAIO) As "CodClasses",   
    110                  PQCx.PADRAO_MINIMO,  
    111                  PQCx.PADRAO_MAXIMO,  
    112                  ME.UNIDADE,  
    113                  PQCRe.AMOSTRA,  
    114                  Observacao=(Select Observacao_Amostra From CTEntrada_PQC Where NUMMP = PQCRe.NUMMP)  
    115       FROM METODOS_ENSAIOS ME INNER JOIN CLASSIFICACAO_ME CME  
    116                                                 ON ME.NUMCLASSE = CME.CODIGO  
    117                                                INNER JOIN PQCxME PQCx  
    118                                                 ON PQCx.CODSEQUENCIALMETODO = ME.CODIGO  
    119                                                INNER JOIN CTENTRADA_ANTERIOR_PQC_RESULTADOS PQCRe  
    120                                                 ON PQCRe.NUMMP = @NumControle  
    121                                                 AND PQCRe.CODSEQUENCIALMETODO = ME.CODIGO  
    122       WHERE PQCx.CODSEQUENCIALPRODUTO = @CodSequencialProduto  
    123       AND     PQCx.CODRELACIONAMENTO = @CodRelacionamento  
    124      End 
    125     End 
    126    End 
    127  
    128   CLOSE CTProducao_PVM_Items_Cursor  
    129   DEALLOCATE CTProducao_PVM_Items_Cursor  
    130  End 
    131  
    132  

    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    sexta-feira, 20 de fevereiro de 2009 17:04
  • Obrigado Raul e Junior Galvao!

    Os exemplos ajudaram muito!

    Coordenador de Projetos / DBA
    sexta-feira, 20 de fevereiro de 2009 17:17