Adicionando um MySQL StoredProcedure provoca não respondendo estado

1

Estou no Windows 7 ultimate 32bit + xampp 1.7.2 [MySQL v5.1.37]

Este é o meu procedimento armazenado:

delimiter //
CREATE PROCEDURE updatePoints(IN parentid INT(5),IN userid INT(5))
DECLARE chpoints INT(5);
BEGIN
 SELECT points INTO chpoints FROM quiz_challenges WHERE id = parentid;
 UPDATE quiz_users SET points = points + chpoints WHERE forumid=userid;
END;
//                                   
delimiter ;

Inicialmente, estava mostrando o erro 1064 ao criar o procedimento armazenado. Eu adicionei parte de delimitadores e quando eu tentei executar a consulta do phpmyadmin, o Firefox entrou em estado não respondendo. Depois disso eu iniciei o Internet Explorer e tentei abrir minhas páginas que usam o mesmo banco de dados, funcionou bem. No entanto, eu tentei abrir o phpmyadmin e o IE entrou em estado não respondendo também. Eu reiniciei os dois servidores. Mais tarde reiniciado PC. Tentei novamente, mas o mesmo comportamento.

Então, o que há de errado com esse pequeno código? Estou faltando algo que pode estar causando loop infinito?

Obrigado

    
por Omie 08.01.2010 / 20:45

2 respostas

1

Na minha experiência, o phpmyadmin não gosta do uso de delimiter // dentro da janela de consulta SQL. Em vez disso, há uma caixa de texto "delimitador" na janela de consulta do phpmyadmin SQL, cujo conteúdo é definido como ";" por padrão. Digite "//" nesta caixa de texto em vez de ";" e tente sua consulta com delimiter // e delimiter ; lines omitidas.

    
por 10.01.2010 / 13:47
0

OBSERVAÇÃO # 1

O pedido está incorreto. O DECLARE chpoint INT(5) deve ser depois de BEGIN , não antes

delimiter //
CREATE PROCEDURE updatePoints(IN parentid INT(5),IN userid INT(5))
BEGIN
 DECLARE chpoints INT(5);
 SELECT points INTO chpoints FROM quiz_challenges WHERE id = parentid;
 UPDATE quiz_users SET points = points + chpoints WHERE forumid=userid;
END;
//                                   
delimiter ;

OBSERVAÇÃO # 2

Você deve ter certeza do seguinte para quiz_users

  • forum_id está indexado
  • points não está indexado (Isso mesmo, eu disse não indexado porque o valor seria incrementado e faria com que o BTREE para o índice daquela coluna misturasse o lugar dessa chave no índice).

OBSERVAÇÃO # 3

Se o script PHP estiver iterando parentid e userid valores, BIG OUCH !!!

Isso indicaria que uma sessão do navegador está fazendo viagens de ida e volta para alimentar cada chamada para o procedimento armazenado. Você deve pensar em passar todas as combinações parentid e userid em uma tabela e deixar o procedimento armazenado manipulá-lo no lado do servidor fazendo viagens de ida e volta a partir da sessão do navegador.

    
por 29.01.2013 / 22:19