SAIR DE UM REPEAT

DANLEONHART 26/07/2012 06:43:31
#406611
Pessoal
Dúvida bem simples...
Como se faz para sair de um laço REPEAT no MySQL ???
O mesmo pode ser usado para sair de outros laços ? (tipo LOOP, WHILE...)

VALEU !
DANLEONHART 26/07/2012 10:50:31
#406626
Valeu Altair148, mas já havia lido estes links para entender o comportamento dos laços , mas mesmo assim não consigo sair do LOOP...

Bem, estou a criar uma função onde ela verifica se o usuário e senha existe na Tabela, se existir retorna TRUE, se não existir retorna FALSE;
O que acontece é que o laço percorre todas as linhas da Tabela, mesmo já tendo encontrado o registro, e é justamente aí que quero colocar para [Ô]sair[Ô] do laço...
ALTAIR148 26/07/2012 10:57:07
#406627
Entendi, no caso teria que ter um IF, que ao encontrar o valor ele pare.. Após voltar do almoço vou ver se consigo algo para você.
ALTAIR148 26/07/2012 10:59:01
#406628
Uma coisa que não entendi... Não seria melhor usar um select não?
DANLEONHART 26/07/2012 11:10:23
#406630
é para aprendizado
Tenho que criar uma Função que check se o usuário existe ou não na Tabela:

Este é meu script até agora:

DELIMITER $$
DROP FUNCTION IF EXISTS sf_Authentication $$
CREATE DEFINER=root@localhost
FUNCTION sf_Authentication(
v_user VARCHAR(50),
v_pass VARCHAR(50)) RETURNS BOOL
BEGIN
DECLARE ncont BOOL DEFAULT 0;
DECLARE rs_user VARCHAR(50);
DECLARE rs_pass VARCHAR(50);
DECLARE vcur CURSOR
FOR SELECT Usuario,Senha
FROM tab_login;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET ncont = 1;

OPEN vcur;
REPEAT
IF (NOT ncont) THEN
FETCH vcur INTO rs_user,rs_pass;
IF (v_user = rs_user && v_pass = rs_pass) THEN
RETURN TRUE;
ELSEIF (v_user != rs_user || v_pass != rs_pass) THEN
RETURN FALSE;
END IF;
END IF;
UNTIL ncont
END REPEAT;
CLOSE vcur;

END $$
DELIMITER ;
ALTAIR148 26/07/2012 12:08:49
#406636
Então, já que é para aprendizado acho que essa não seria o melhor caso para se aplicar um LOOP, mas vamos lá, não testei aqui mas tente algo do tipo abaixo.

DELIMITER $$
DROP FUNCTION IF EXISTS sf_Authentication $$
CREATE DEFINER=root@localhost
FUNCTION sf_Authentication(
v_user VARCHAR(50),
v_pass VARCHAR(50)) RETURNS BOOL
BEGIN
DECLARE ncont BOOL DEFAULT 0;
DECLARE rs_user VARCHAR(50);
DECLARE rs_pass VARCHAR(50);
DECLARE vcur CURSOR
FOR SELECT Usuario,Senha
FROM tab_login;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET ncont = 1;

OPEN vcur;
REPEAT
IF (NOT ncont) THEN
FETCH vcur INTO rs_user,rs_pass;
IF (v_user = rs_user && v_pass = rs_pass) THEN
RETURN TRUE;
END REPEAT;
ELSEIF (v_user != rs_user || v_pass != rs_pass) THEN
RETURN FALSE;
END IF;
END IF;
UNTIL ncont

CLOSE vcur;

END $$
DELIMITER ;
DANLEONHART 26/07/2012 13:41:15
#406642
Não rolou...o END REPEAT tem de ficar após o UNTIL...estou tentando com outro tipo de laço, o LOOP, LEAVE.
ALTAIR148 26/07/2012 14:13:59
#406649
Resposta escolhida
Tente o While.
DANLEONHART 26/07/2012 14:20:07
#406651
Consegui !
Li mais sobre o LEAVE e descobri que ele não é de uso específico do LOOP...mas funciona com o WHILE, LOOP e o REPEAT (basta usar os parâmetros opcionais [Ô]begin_label / end_label[Ô] para setar o laço).

Minha Stored Function ficou assim:

DELIMITER $$
DROP FUNCTION IF EXISTS sf_Authentication $$
CREATE DEFINER=root@localhost
FUNCTION sf_Authentication(
v_user VARCHAR(50),
v_pass VARCHAR(50)) RETURNS BOOL
BEGIN
DECLARE ncont BOOL DEFAULT 0;
DECLARE rpt BOOL DEFAULT 0;
DECLARE rs_user VARCHAR(50);
DECLARE rs_pass VARCHAR(50);
DECLARE vcur CURSOR
FOR SELECT Usuario,Senha
FROM tab_login;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET ncont = 1;

OPEN vcur;
_loop: REPEAT
FETCH vcur INTO rs_user,rs_pass;
IF NOT ncont THEN
IF (v_user = rs_user && v_pass = rs_pass) THEN
SET rpt = TRUE;
LEAVE _loop;
END IF;
END IF;
UNTIL ncont
END REPEAT;
RETURN rpt;
CLOSE vcur;

END $$
DELIMITER ;


Usando:

SET @n = sf_Authentication([ô]Nome do User[ô],[ô]Senha do User[ô]);
SELECT @n


Retorna [Ô]1[Ô] se usuário e Senha estiverem correto; e [Ô]0[Ô] se um dos dois forem informado errado.
Valeu pela força ALTAIR148 !
Tópico encerrado , respostas não são mais permitidas