SAIR DE UM REPEAT
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 !
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 !
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...
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...
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ê.
Uma coisa que não entendi... Não seria melhor usar um select não?
é 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:
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 ;
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 ;
Não rolou...o END REPEAT tem de ficar após o UNTIL...estou tentando com outro tipo de laço, o LOOP, LEAVE.
Tente o While.
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:
Usando:
Retorna [Ô]1[Ô] se usuário e Senha estiverem correto; e [Ô]0[Ô] se um dos dois forem informado errado.
Valeu pela força ALTAIR148 !
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