O que tem de errado nessa Procedure?
Boa tarde galera, nao tenho nenhuma intimidade com o sql server e estou tentando criar um procedure que segue logo abaixo, minha primeira duvida era como fazer um loop para que eu pudesse inserir ´n´ registros em uma tabela, ai vi alguns exemplos aqui mesmo criando cursores. Esta procedure e para inserir em uma outra tablela exames de acordo com os parametros passados, porem me parece que ela entra em loop, pois ela executa porem nao para de executar. Minha condicao de para é o ´@@FETCH_STATUS = 0´. O que siguinifica isso? Se alquem puder me ajudar, ficarei agradecido.
CREATE PROCEDURE sp_Aso_Exame_CARGO(@in_pFK_ASO INT,
@in_pFK_CARGO INT,
@in_pFK_CLIENTE INT,
@in_pFK_EXAME_REALIZADO INT,
@in_pFK_FUNCIONARIO INT,
@in_pFK_SETOR INT,
@in_pASOE_DATA_REALIZACAO DATETIME)
AS
DECLARE @vFK_EXAMES int
DECLARE @vFK_RISCOS int
DECLARE @vEEC_PERIODICIDADE int
DECLARE CUR_ASO_EXAMES CURSOR FOR
SELECT TAB_ASO_EXAMES.FK_EXAMES
FROM TAB_ASO_EXAMES
WHERE (TAB_ASO_EXAMES.FK_CARGO = @in_pFK_CARGO)
AND (TAB_ASO_EXAMES.FK_SETOR = @in_pFK_SETOR)
AND (TAB_ASO_EXAMES.FK_CLIENTE = @in_pFK_CLIENTE)
BEGIN
/* Procedure body */
OPEN CUR_ASO_EXAMES
FETCH NEXT FROM CUR_ASO_EXAMES INTO
@vFK_EXAMES
while @@FETCH_STATUS = 0
begin
insert into TAB_ASO_EXAMES (TAB_ASO_EXAMES.FK_ASO,
TAB_ASO_EXAMES.FK_CARGO,
TAB_ASO_EXAMES.FK_CLIENTE,
TAB_ASO_EXAMES.FK_EXAMES,
TAB_ASO_EXAMES.FK_EXAME_REALIZADO,
TAB_ASO_EXAMES.FK_FUNCIONARIO,
TAB_ASO_EXAMES.FK_SETOR,
TAB_ASO_EXAMES.ASOE_DATA_REALIZACAO)
values
(@in_pFK_ASO,
@in_pFK_CARGO,
@in_pFK_CLIENTE,
@vFK_EXAMES,
@in_pFK_EXAME_REALIZADO,
@in_pFK_FUNCIONARIO,
@in_pFK_SETOR,
@in_pASOE_DATA_REALIZACAO)
end
close CUR_ASO_EXAMES
deallocate CUR_ASO_EXAMES
END
CREATE PROCEDURE sp_Aso_Exame_CARGO(@in_pFK_ASO INT,
@in_pFK_CARGO INT,
@in_pFK_CLIENTE INT,
@in_pFK_EXAME_REALIZADO INT,
@in_pFK_FUNCIONARIO INT,
@in_pFK_SETOR INT,
@in_pASOE_DATA_REALIZACAO DATETIME)
AS
DECLARE @vFK_EXAMES int
DECLARE @vFK_RISCOS int
DECLARE @vEEC_PERIODICIDADE int
DECLARE CUR_ASO_EXAMES CURSOR FOR
SELECT TAB_ASO_EXAMES.FK_EXAMES
FROM TAB_ASO_EXAMES
WHERE (TAB_ASO_EXAMES.FK_CARGO = @in_pFK_CARGO)
AND (TAB_ASO_EXAMES.FK_SETOR = @in_pFK_SETOR)
AND (TAB_ASO_EXAMES.FK_CLIENTE = @in_pFK_CLIENTE)
BEGIN
/* Procedure body */
OPEN CUR_ASO_EXAMES
FETCH NEXT FROM CUR_ASO_EXAMES INTO
@vFK_EXAMES
while @@FETCH_STATUS = 0
begin
insert into TAB_ASO_EXAMES (TAB_ASO_EXAMES.FK_ASO,
TAB_ASO_EXAMES.FK_CARGO,
TAB_ASO_EXAMES.FK_CLIENTE,
TAB_ASO_EXAMES.FK_EXAMES,
TAB_ASO_EXAMES.FK_EXAME_REALIZADO,
TAB_ASO_EXAMES.FK_FUNCIONARIO,
TAB_ASO_EXAMES.FK_SETOR,
TAB_ASO_EXAMES.ASOE_DATA_REALIZACAO)
values
(@in_pFK_ASO,
@in_pFK_CARGO,
@in_pFK_CLIENTE,
@vFK_EXAMES,
@in_pFK_EXAME_REALIZADO,
@in_pFK_FUNCIONARIO,
@in_pFK_SETOR,
@in_pASOE_DATA_REALIZACAO)
end
close CUR_ASO_EXAMES
deallocate CUR_ASO_EXAMES
END
Luciano Andrade
Curtidas 0
Respostas
Psergio.p
04/04/2007
FETCH NEXT você executa para posicionar no primeiro registro do CURSOR, correto? Quando você entra no bloco de repetição você também tem que executar FETCH NEXT senão o CURSOR ficará posicionado sempre no mesmo registro e não processará o proximo.
Assim fica em loop mesmo!
Insere um FETCH NEXT após você incluir o registro!
Entendeu?
Assim fica em loop mesmo!
Insere um FETCH NEXT após você incluir o registro!
Entendeu?
GOSTEI 0
Luciano Andrade
04/04/2007
FETCH NEXT você executa para posicionar no primeiro registro do CURSOR, correto? Quando você entra no bloco de repetição você também tem que executar FETCH NEXT senão o CURSOR ficará posicionado sempre no mesmo registro e não processará o proximo.
Assim fica em loop mesmo!
Insere um FETCH NEXT após você incluir o registro!
Entendeu?
Ham agora deu certo porem, ao executar ele da um erro de duplicação de chave, voce sabe se existe uma possibilidade do FEXT NEXT nao estar passando para o proximo registro?
GOSTEI 0
Macario
04/04/2007
Olá [b:7441c9d4eb]cd.lemandrade[/b:7441c9d4eb]
Vejo aqui lhe ajudar pois vejo que você não compreendeu o funcionamento do FETCH NEXT completamente.
Sempre que se efetua um FETCH NEXT por razão há necessidade de atribuir o valor obtido a uma variavel no seu caso [b:7441c9d4eb]@vFK_EXAMES[/b:7441c9d4eb]
Então após a instrução de insert inclua novamente
FETCH NEXT FROM CUR_ASO_EXAMES INTO
@vFK_EXAMES
Espero que lhe ajude.
[]´s.
P.s.: Evite duplicar topicos.
....
Insere um FETCH NEXT após você incluir o registro!
Entendeu?
Vejo aqui lhe ajudar pois vejo que você não compreendeu o funcionamento do FETCH NEXT completamente.
Sempre que se efetua um FETCH NEXT por razão há necessidade de atribuir o valor obtido a uma variavel no seu caso [b:7441c9d4eb]@vFK_EXAMES[/b:7441c9d4eb]
Então após a instrução de insert inclua novamente
FETCH NEXT FROM CUR_ASO_EXAMES INTO
@vFK_EXAMES
Espero que lhe ajude.
[]´s.
P.s.: Evite duplicar topicos.
GOSTEI 0
Luciano Andrade
04/04/2007
Pois aqui neste exemplo que eu nao coloquei, mas na minha procedure coloquei o fetch depois do insert e mesmo assim parece que ele nao pega o proximo @vFK_EXAMES, sabe por que?
GOSTEI 0
Luciano Andrade
04/04/2007
pois é neste exemplo nao coloquei o fetch, mas no meu caso eu colquei o fetch depois do insert e parece que nao atribui o proximo @vFK_EXAMES, sabe por que?
GOSTEI 0
Luciano Andrade
04/04/2007
pois é neste exemplo nao coloquei o fetch, mas no meu caso eu colquei o fetch depois do insert e parece que nao atribui o proximo @vFK_EXAMES, sabe por que?
o caso do loop foi resolvido com esse toque que voces me deram, porem ao executar essa procedure ela so insere um registro segue abaixo a procedure original.
CREATE PROCEDURE dbo.SP_INSERE_RISCO_CARGO (@in_pFK_ASO INT,
@in_pFK_CARGO INT,
@in_pFK_CLIENTE INT,
@in_pFK_EXAME_REALIZADO INT,
@in_pFK_FUNCIONARIO INT,
@in_pFK_SETOR INT)
AS
DECLARE @vFK_RISCOS int
DECLARE CUR_ASO_RISCO CURSOR FOR
SELECT distinct(TAB_ASO_RISCO.FK_RISCOS)
FROM TAB_ASO_RISCO
WHERE (TAB_ASO_RISCO.FK_CARGO = @in_pFK_CARGO)
AND (TAB_ASO_RISCO.FK_CLIENTE = @in_pFK_CLIENTE)
AND (TAB_ASO_RISCO.FK_SETOR = @in_pFK_SETOR)
BEGIN
/* Procedure body */
OPEN CUR_ASO_RISCO
FETCH NEXT FROM CUR_ASO_RISCO INTO
@vFK_RISCOS
while @@FETCH_STATUS = 0
begin
insert into TAB_ASO_RISCO (TAB_ASO_RISCO.FK_ASO,
TAB_ASO_RISCO.FK_CARGO,
TAB_ASO_RISCO.FK_CLIENTE,
TAB_ASO_RISCO.FK_EXAME_REALIZADO,
TAB_ASO_RISCO.FK_FUNCIONARIO,
TAB_ASO_RISCO.FK_SETOR,
TAB_ASO_RISCO.FK_RISCOS)
values
(@in_pFK_ASO ,
@in_pFK_CARGO ,
@in_pFK_CLIENTE,
@in_pFK_EXAME_REALIZADO,
@in_pFK_FUNCIONARIO,
@in_pFK_SETOR,
@vFK_RISCOS)
FETCH NEXT FROM CUR_ASO_RISCO
end/*@@FETCH_STATUS = 0 CUR_ASO_RISCO*/
close CUR_ASO_RISCO
deallocate CUR_ASO_RISCO
END
GOSTEI 0
Macario
04/04/2007
Olá, novamente vamos ver se ajudamos.
CREATE PROCEDURE dbo.SP_INSERE_RISCO_CARGO (@in_pFK_ASO INT,
@in_pFK_CARGO INT,
@in_pFK_CLIENTE INT,
@in_pFK_EXAME_REALIZADO INT,
@in_pFK_FUNCIONARIO INT,
@in_pFK_SETOR INT)
AS
DECLARE @vFK_RISCOS int
DECLARE CUR_ASO_RISCO CURSOR FOR
SELECT distinct(TAB_ASO_RISCO.FK_RISCOS)
FROM TAB_ASO_RISCO
WHERE (TAB_ASO_RISCO.FK_CARGO = @in_pFK_CARGO)
AND (TAB_ASO_RISCO.FK_CLIENTE = @in_pFK_CLIENTE)
AND (TAB_ASO_RISCO.FK_SETOR = @in_pFK_SETOR)
BEGIN
/* Procedure body */
OPEN CUR_ASO_RISCO
FETCH NEXT FROM CUR_ASO_RISCO INTO
@vFK_RISCOS
while @@FETCH_STATUS = 0
begin
insert into TAB_ASO_RISCO (TAB_ASO_RISCO.FK_ASO,
TAB_ASO_RISCO.FK_CARGO,
TAB_ASO_RISCO.FK_CLIENTE,
TAB_ASO_RISCO.FK_EXAME_REALIZADO,
TAB_ASO_RISCO.FK_FUNCIONARIO,
TAB_ASO_RISCO.FK_SETOR,
TAB_ASO_RISCO.FK_RISCOS)
values
(@in_pFK_ASO ,
@in_pFK_CARGO ,
@in_pFK_CLIENTE,
@in_pFK_EXAME_REALIZADO,
@in_pFK_FUNCIONARIO,
@in_pFK_SETOR,
@vFK_RISCOS)
[b:d0e1eca67f]FETCH NEXT FROM CUR_ASO_RISCO INTO
@vFK_RISCOS [/b:d0e1eca67f]
end
close CUR_ASO_RISCO
deallocate CUR_ASO_RISCO
END
A indicação em negrito aponta onde você precisa alterar a procedure, compreende. :roll:
CREATE PROCEDURE dbo.SP_INSERE_RISCO_CARGO (@in_pFK_ASO INT,
@in_pFK_CARGO INT,
@in_pFK_CLIENTE INT,
@in_pFK_EXAME_REALIZADO INT,
@in_pFK_FUNCIONARIO INT,
@in_pFK_SETOR INT)
AS
DECLARE @vFK_RISCOS int
DECLARE CUR_ASO_RISCO CURSOR FOR
SELECT distinct(TAB_ASO_RISCO.FK_RISCOS)
FROM TAB_ASO_RISCO
WHERE (TAB_ASO_RISCO.FK_CARGO = @in_pFK_CARGO)
AND (TAB_ASO_RISCO.FK_CLIENTE = @in_pFK_CLIENTE)
AND (TAB_ASO_RISCO.FK_SETOR = @in_pFK_SETOR)
BEGIN
/* Procedure body */
OPEN CUR_ASO_RISCO
FETCH NEXT FROM CUR_ASO_RISCO INTO
@vFK_RISCOS
while @@FETCH_STATUS = 0
begin
insert into TAB_ASO_RISCO (TAB_ASO_RISCO.FK_ASO,
TAB_ASO_RISCO.FK_CARGO,
TAB_ASO_RISCO.FK_CLIENTE,
TAB_ASO_RISCO.FK_EXAME_REALIZADO,
TAB_ASO_RISCO.FK_FUNCIONARIO,
TAB_ASO_RISCO.FK_SETOR,
TAB_ASO_RISCO.FK_RISCOS)
values
(@in_pFK_ASO ,
@in_pFK_CARGO ,
@in_pFK_CLIENTE,
@in_pFK_EXAME_REALIZADO,
@in_pFK_FUNCIONARIO,
@in_pFK_SETOR,
@vFK_RISCOS)
[b:d0e1eca67f]FETCH NEXT FROM CUR_ASO_RISCO INTO
@vFK_RISCOS [/b:d0e1eca67f]
end
close CUR_ASO_RISCO
deallocate CUR_ASO_RISCO
END
A indicação em negrito aponta onde você precisa alterar a procedure, compreende. :roll:
GOSTEI 0
Luciano Andrade
04/04/2007
Olá, novamente vamos ver se ajudamos.
CREATE PROCEDURE dbo.SP_INSERE_RISCO_CARGO (@in_pFK_ASO INT,
@in_pFK_CARGO INT,
@in_pFK_CLIENTE INT,
@in_pFK_EXAME_REALIZADO INT,
@in_pFK_FUNCIONARIO INT,
@in_pFK_SETOR INT)
AS
DECLARE @vFK_RISCOS int
DECLARE CUR_ASO_RISCO CURSOR FOR
SELECT distinct(TAB_ASO_RISCO.FK_RISCOS)
FROM TAB_ASO_RISCO
WHERE (TAB_ASO_RISCO.FK_CARGO = @in_pFK_CARGO)
AND (TAB_ASO_RISCO.FK_CLIENTE = @in_pFK_CLIENTE)
AND (TAB_ASO_RISCO.FK_SETOR = @in_pFK_SETOR)
BEGIN
/* Procedure body */
OPEN CUR_ASO_RISCO
FETCH NEXT FROM CUR_ASO_RISCO INTO
@vFK_RISCOS
while @@FETCH_STATUS = 0
begin
insert into TAB_ASO_RISCO (TAB_ASO_RISCO.FK_ASO,
TAB_ASO_RISCO.FK_CARGO,
TAB_ASO_RISCO.FK_CLIENTE,
TAB_ASO_RISCO.FK_EXAME_REALIZADO,
TAB_ASO_RISCO.FK_FUNCIONARIO,
TAB_ASO_RISCO.FK_SETOR,
TAB_ASO_RISCO.FK_RISCOS)
values
(@in_pFK_ASO ,
@in_pFK_CARGO ,
@in_pFK_CLIENTE,
@in_pFK_EXAME_REALIZADO,
@in_pFK_FUNCIONARIO,
@in_pFK_SETOR,
@vFK_RISCOS)
[b:1578b3e64f]FETCH NEXT FROM CUR_ASO_RISCO INTO
@vFK_RISCOS [/b:1578b3e64f]
end
close CUR_ASO_RISCO
deallocate CUR_ASO_RISCO
END
irei alterar para o que? Me desculpe mas sou muito leigo no sql....
A indicação em negrito aponta onde você precisa alterar a procedure, compreende. :roll:
GOSTEI 0
Rjun
04/04/2007
Seu código esta assim:
O Macario disse para você deixa-lo assim:
Você precisa dizer ao FETCH que ele deve atribuir os valores para suas variáveis.
FETCH NEXT FROM CUR_ASO_RISCO
O Macario disse para você deixa-lo assim:
FETCH NEXT FROM CUR_ASO_EXAMES INTO @vFK_EXAMES
Você precisa dizer ao FETCH que ele deve atribuir os valores para suas variáveis.
GOSTEI 0