WHILE NO MYSQL EXISTE?
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á
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á
você pode fazer isso no MySQL usando um cursor exemplo:
você pode aprender mais aqui
http://dev.mysql.com/doc/refman/5.0/en/cursors.html
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
Sim amigo existe sim....
Veja um simples exemplo (coloque dentro de uma estrutura de procedure)
Basta utilizar agora a lógica para elaborar algo mais adequado a sua necessidade.
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.
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;
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