Inquiridor
Cursor com passagem de parâmetro

Pergunta
-
Boa noite,
gostaria de tirar uma dúvida sobre como criar um cursor onde possa ao abri passar valor para um parâmentro!
Vamos supor que tenho a seguinte estrutura de tabela
NM_ESTADO_ID INT
DS_ESTADO_NOM VARCHAR(50)
Contendo os seguintes registros
Code SnippetNM_ESTADO_ID DS_ESTADO_NOME
------------------- ------------------------
1 SP
2 RJ
3 TO
4 PA
5 RR
criarei um corsor que trás todos os registrosCode Snippet
DECLARE @DS_ESTADO_NOME VARCHAR(60)
DECLARE NEWCURSOR CURSOR LOCAL FOR SELECT DS_ESTADO_NOME FROM TB_MENU
OPEN NEWCURSOR
FETCH NEXT FROM NEWCURSOR INTO @DS_MENU_DESC
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @DS_MENU_DESC
FETCH NEXT FROM NEWCURSOR INTO @DS_ESTADO_NOME
END
CLOSE NEWCURSOR
DEALLOCATE NEWCURSOR
A saída disso seria
queria passar como parâmeto um valor para filtrar por nm_estado_id
SP
RJ
TO
PA
RR
obrigado!
Todas as Respostas
-
-
-
Bom dia pessoal,
Trabalho com Oracle e conheço a sintaxe para declarar um cursor que recebe parâmetros para utilizar nos filtros do select, agora para SQL Server não lembro a sintaxe.
Na realidade quero relembrar a forma de declarar o cursor para que eu possa passar os parâmetros quando tiver que utilizar um cursor dentro de outro.
Por exemplo,... Vamos supor que eu tenha dois cursores declarados e eu só vá abri o segundo depois do resultado que o primeiro me trouxer, passando esse resultado como parâmetro para o filtro do select existente no segundo cursor.
-
Boa Tarde,
Há um exemplo de como declarar um cursor dentro do outro no Books OnLine. Segue o exemplo:
Code SnippetSET
NOCOUNT ONDECLARE @vendor_id int, @vendor_name nvarchar(50),
@message
varchar(80), @product nvarchar(50)PRINT
'-------- Vendor Products Report --------'DECLARE
vendor_cursor CURSOR FORSELECT
VendorID, Name FROM Purchasing.VendorWHERE
PreferredVendorStatus = 1ORDER
BY VendorIDOPEN
vendor_cursorFETCH
NEXT FROM vendor_cursorINTO
@vendor_id, @vendor_nameWHILE
@@FETCH_STATUS = 0BEGIN
PRINT
' 'SELECT
@message = '----- Products From Vendor: ' + @vendor_namePRINT
@message-- Declare an inner cursor based
-- on vendor_id from the outer cursor.
DECLARE
product_cursor CURSOR FORSELECT
v.NameFROM
Purchasing.ProductVendor pv, Production.Product vWHERE
pv.ProductID = v.ProductID AND pv.VendorID = @vendor_id-- Variable value from the outer cursorOPEN
product_cursorFETCH
NEXT FROM product_cursor INTO @productIF
@@FETCH_STATUS <> 0PRINT
' <<None>>'WHILE
@@FETCH_STATUS = 0BEGIN
SELECT
@message = ' ' + @productPRINT
@messageFETCH
NEXT FROM product_cursor INTO @productEND
CLOSE
product_cursorDEALLOCATE
product_cursor-- Get the next vendor.
FETCH
NEXT FROM vendor_cursorINTO
@vendor_id, @vendor_nameEND
CLOSE
vendor_cursorDEALLOCATE
vendor_cursorAinda assim, aconselho a rever se há mesmo necessidade de produzir dois cursores. Cursores são mais lentos e mais caros em relação a instruções SELECT comuns.
[ ]s,
Gustavo
-
Boa tarde Gustavo,
A sim, essa forma eu havia visualizado já, mas tem uma forma de você deixar ele declarado já criando os campos de entrada de passagem de parâmentros, dai passar esses parâmetros quando executar o open nome_do_cursor param1, param2 ... , é esse que estou tentando lembrar.
Havia tentado colocando os parametros depois do nome assim:
Code SnippetDECLARE NEWCURSO (@ID INT ) CURSOR FOR SELECT * FROM TABELA WHERE CAMPO = @ID