WHILE NO MYSQL EXISTE?

DOUGLASJ 16/04/2012 08:34:20
#399941
Pessoal, boa tarde!

Minha dúvida é se tem alguma maneira de dentro do While, ou alguma estrutura de repetição, realizar alguma ação para o retorno de uma select.

Vamos supor que no caso que citei na abertura do tópico me retornasse 10 linhas, dentro do loop atraves do alias [ô]a[ô] eu acessaria todos os campos da linha até a 10ª posicao.

Estou querendo fazer uma procedure no MySQL com essa função, um problema que no Oracle se resolveria mais ou menos assim:

for a in (select id, nome, salario from usuario)
loop
/*
Meu código aqui. Realizar um novo select, insert, update e etc.
*/
end loop;

Obrigado desde já
MARCELO.TREZE 16/04/2012 20:50:11
#400017
Resposta escolhida
você pode fazer isso no MySQL usando um cursor exemplo:

CREATE PROCEDURE curdemo()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE a CHAR(16);
DECLARE b, c INT;
DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cur1;
OPEN cur2;

read_loop: LOOP
FETCH cur1 INTO a, b;
FETCH cur2 INTO c;
IF done THEN
LEAVE read_loop;
END IF;
IF b < c THEN
INSERT INTO test.t3 VALUES (a,b);
ELSE
INSERT INTO test.t3 VALUES (a,c);
END IF;
END LOOP;

CLOSE cur1;
CLOSE cur2;
END;


você pode aprender mais aqui

http://dev.mysql.com/doc/refman/5.0/en/cursors.html
FOXMAN 16/04/2012 21:27:55
#400019
Sim amigo existe sim....
Veja um simples exemplo (coloque dentro de uma estrutura de procedure)

DECLARE sloop INT;
DECLARE v1 INT DEFAULT 0;
DECLARE scodigo INT;
DECLARE icod INT;
SET SLOOP = (SELECT COUNT(ID) FROM TABELAXXXXXXX);
WHILE v1 < sloop DO
UPDATE tabelayyyyyyyyyyy SET campoxxxxxx = asdfasjfasdfafd;
SET v1 = v1 + 1;
END WHILE;


Basta utilizar agora a lógica para elaborar algo mais adequado a sua necessidade.

DOUGLASJ 18/04/2012 14:25:47
#400171
Valeu Galera o que vcs me passaram deu a luz que eu precisava... vou deixarf aqui o como ficou o meu código para ajudar tbm quem tiver a mesma dúvida..

CREATE DEFINER='root'@'localhost' PROCEDURE 'AJUSTA_LOTE_PEDIDO'(
IN p_COD int(11) /* VARIAVEL DO N. DO PEDIDO*/
)
BEGIN
/* AS VARIÁVEIS TÊM QUE SEREM DECLARAS ANTES DO CURSOR(RECORDSET) */
DECLARE ultimoRegistro BIT DEFAULT 0; /* Variavel de controle de fim de lista do SELECT */
DECLARE p_sigla varchar(20); /* Variavel para receber a String do SELECT */
DECLARE p_lote varchar(50); /* Variavel para receber a String do SELECT */
DECLARE RS CURSOR FOR SELECT sigla,lote,CONSIG FROM produtosaida where tipoOS=1 and
SAIDAcancelada=0 and OS=p_COD order by sigla, lote; /* Declara o CURSOR(RECORDSET) e os itens que virao nele */
DECLARE exit HANDLER FOR not found SET ultimoRegistro = 1; /* Define o que acontece quando nao encontrar mais registros na lista */

UPDATE prodinclu_PEDIDO SET lote =null WHERE COD= p_COD; /* LIMPA O CONTEUDO DO CAMPO LOTE PARA ATUALIZAR */

OPEN RS; /*ABRE O CURSOR(RECORDSET) */

WHILE ultimoRegistro <> 1 DO /*REPETE O LACO ENQUANTO VARIAVEL DE CONTROLE NAO ENCOTRAR O ULTIMO REGISTRO */
FETCH RS INTO p_sigla, p_lote, p_COD; /* ATRIBUI O VALOR DOS ITENS DO SELECT ÀS VARIAVEIS EM SUA RESPECTIVA ORDEM PARA PODER MANIPULAR
PELA VARIAVEL

/*EXECUTA O UPDATE NA TABELA DE PRODUTOS DO PEDIDO*/
UPDATE prodinclu_PEDIDO SET lote =
CASE isnull(lote) =true /* CASO O CAMPO LOTE SEJA VAZIO */
WHEN true THEN concat([ô]Lote(s): [ô],[Ô][Ô],p_lote) /* COLOCARA A PALAVRA: LOTE(S): E O CAMPO LOTE DA TABELA PRODUTO SAIDA*/
else concat(lote,[Ô] - [Ô],p_lote) /* CASO ELE SEJA DIFERENTE DE VAZIO COLOCARA O VALOR DELE MESMOS E O CAMPO LOTE DA TABELA PRODUTO SAIDA*/
END /* FIM DO CASE */
WHERE SIGLAprod=p_sigla and COD=p_COD; /* VERIFICA SE O CAMPO SIGLA E O MESMO E SE O Nº DO PEDIDOE O DA VARIAVEL */
END WHILE; /* FIM DO LACO */

CLOSE RS; /*FECHA O CURSOR(RECORDSET) */

END;
Tópico encerrado , respostas não são mais permitidas