Usuário com melhor resposta
Declarar CURSOR com parâmetro

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?1 CURSOR CURSOR1 (DATA DATE) IS 2 SELECT * FROM TABELA WHERE TRUNC(DATAINICIAL) <= DATA 3
Obrigado!
Coordenador de Projetos / DBA
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- Marcado como Resposta Alessandro Falanque sexta-feira, 20 de fevereiro de 2009 17:17
-
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- Marcado como Resposta Alessandro Falanque sexta-feira, 20 de fevereiro de 2009 17:17
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 -
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 -
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- Marcado como Resposta Alessandro Falanque sexta-feira, 20 de fevereiro de 2009 17:17
-
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- Marcado como Resposta Alessandro Falanque sexta-feira, 20 de fevereiro de 2009 17:17
-