04/04/2007

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


Luciano Andrade

Respostas

05/04/2007

Psergio.p

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?


Responder Citar

11/04/2007

Luciano Andrade

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?


Responder Citar

12/04/2007

Macario

Olá [b:7441c9d4eb]cd.lemandrade[/b:7441c9d4eb]

.... 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.


Responder Citar

12/04/2007

Luciano Andrade

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?


Responder Citar

12/04/2007

Luciano Andrade

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?


Responder Citar

12/04/2007

Luciano Andrade

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


Responder Citar

12/04/2007

Macario

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:


Responder Citar

13/04/2007

Luciano Andrade

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:



Responder Citar

13/04/2007

Rjun

Seu código esta assim:
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.


Responder Citar