Array
(
)

O que tem de errado nessa Procedure?

Luciano Andrade
   - 04 abr 2007

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

Psergio.p
   - 05 abr 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?

Luciano Andrade
   - 11 abr 2007


Citação:
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?

Macario
   - 12 abr 2007

Olá cd.lemandrade

Citação:
....

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 @vFK_EXAMES

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.

Luciano Andrade
   - 12 abr 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?

Luciano Andrade
   - 12 abr 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?

Luciano Andrade
   - 12 abr 2007


Citação:
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

Macario
   - 12 abr 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)
FETCH NEXT FROM CUR_ASO_RISCO INTO
@vFK_RISCOS

end
close CUR_ASO_RISCO
deallocate CUR_ASO_RISCO
END

A indicação em negrito aponta onde você precisa alterar a procedure, compreende. :roll:

Luciano Andrade
   - 13 abr 2007


Citação:
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)
FETCH NEXT FROM CUR_ASO_RISCO INTO
@vFK_RISCOS

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:


Rjun
   - 13 abr 2007

Seu código esta assim:
#Código

FETCH NEXT FROM CUR_ASO_RISCO 


O Macario disse para você deixa-lo assim:
#Código
FETCH NEXT FROM CUR_ASO_EXAMES INTO 
@vFK_EXAMES 


Você precisa dizer ao FETCH que ele deve atribuir os valores para suas variáveis.