Percorrer View e montar SQL dinamicamente [RESOLVIDO]

1. Percorrer View e montar SQL dinamicamente [RESOLVIDO]

Silvério Coelho Sepulveda
isilver

(usa CentOS)

Enviado em 28/05/2013 - 09:36h

Bom dia e saudações a todos.

Gente seguinte, sou usuário de Firebird e há alguns meses estou usando mysql, porém
durante o processo de migração esbarrei em algumas dificuldades e até agora as superei,
só que agora tenho o seguinte problema:

Tenho uma tabela chamada listas que tem
chave_lista int
nome varchar(100)
descriccao varchar(100)

Nesta tabela guardo campos comuns como bairro, cidade, cep, fabricante entre outros
que são listados em um input text nos sites com autocomplete.

Porém quando o usuário quer excluir um destes registros, eu peço a ele que escolha um
outro registro para ser atualizado, tipo, tem o bairro CENTO e outro CENTRO, como o CENTO
está errado vai trocar POR CENTRO, ai que vem o problema, no Firebird eu tenho um view que
lista todos os relacionamentos na base, isso eu já criei no Mysql

Agora o que eu preciso é fazer uma FUNCTION ou PROCEDURE para percorrer esta view
e alterar a OLDCHAVE pela NEWCHAVE da lista, e não conseguí fazer isto com o mysql,
no firebird eu usava FOR SELECT * FROM VIEW_RELACIONAMENTOS montava um sql e usava
o EXECUTE STATEMANT para executá-lo.

Se alguém tiver alguma idéia de como resolver isto no mysql agradeço.

Desde já obrigado.



  


2. MELHOR RESPOSTA

Guilherme
guipsp

(usa Ubuntu)

Enviado em 04/06/2013 - 17:11h

Que bom que funcionou.

Agora aproveitando, deixa trocar uma idéia, o que acha mais estável, fazer via php ou fazer via procedimento no banco de dados/


Pergunta difícil colega. Vai de uma analise de varias coisas.

Eu particularmente usaria via programação no PHP olhando por fora (sem saber como funciona o sistema, ambiente que ele roda, etc).

Uma coisa que esqueci de falar no outro post é para tomar cuidado com o "SET SQL_SAFE_UPDATES=1;". Ele vai setar o safe update para a sessão, isso pode afetar seu sistema (não permitindo update ou delete sem where, por exemplo) se no cliente estiver configurado para 0 por exemplo. Se não for afetar tudo bem, mas caso precise manter o valor você pode pegar o valor atual dele +- assim:


DECLARE valor INT;
DECLARE cSafeUpdate CURSOR FOR SELECT @@sql_safe_updates;
OPEN cSafeUpdate;
FETCH cSafeUpdate INTO valor;
SET SQL_SAFE_UPDATES=0;
--UPDATE
SET SQL_SAFE_UPDATES=valor;


Nesse caso também tem a questão de tratamento de erro para garantir que o valor volte ao normal caso de um erro no update.

3. Re: Percorrer View e montar SQL dinamicamente [RESOLVIDO]

Guilherme
guipsp

(usa Ubuntu)

Enviado em 04/06/2013 - 10:09h

Bom dia,

Acho que com cursor você resolve isso. Segue um exemplo:


DELIMITER $$

DROP PROCEDURE IF EXISTS pTeste $$

CREATE PROCEDURE pTeste()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE newChave INT;
DECLARE cTabela CURSOR FOR SELECT cd FROM teste;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cTabela;
read_loop: LOOP
#aqui você pega os valores do "select", para mais campos vocÇe pode fazer assim:
#cTabela INTO c1, c2, c3, ..., cn
FETCH cTabela INTO newChave;
IF done THEN
LEAVE read_loop;
END IF;

INSERT INTO teste2(cd) VALUES (newChave);

END LOOP;

CLOSE cTabela;
END $$

DELIMITER ;


Para chamar essa procedure use:

call pTeste;


4. Re: Percorrer View e montar SQL dinamicamente [RESOLVIDO]

Diego Lepera
d_lepera

(usa Linux Mint)

Enviado em 04/06/2013 - 12:04h

Cara, pelo que eu entendi você tem uma chave estrangeira e quando alterar na tabela de origem quer que seja alterado tbm na tabela vinculada para não perder o vínculo, correto??

nesse caso, existe uma funcionalidade do SQL (mysql ou até sql server) que faz isso para você. Na tabela vinculada ao configurar a chave estrangeira você pode fazer assim:

ALTER TABLE [tabela_vinculada]
ADD CONSTRAINT FK_campo_fk FOREIGN KEY(campo_)
REFERENCES [tabela_origem](campo_pk)fk
ON UPDATE CASCADE;

O "ON UPDATE CASCADE" faz exatamente o que você quer de forma segura e automática... assim que você alterar a chave na tabela de origem a fk será atualizada automaticamente, sem perder o vinculo.

Abs.



5. Re: Percorrer View e montar SQL dinamicamente [RESOLVIDO]

Silvério Coelho Sepulveda
isilver

(usa CentOS)

Enviado em 04/06/2013 - 15:12h

Pessoal valeu pela atenção.

Tentei usar como o quipsp disse, no meu caso ficou assim:

DELIMITER $$

DROP PROCEDURE IF EXISTS pTeste $$

CREATE PROCEDURE pTeste(
IN OLDCHAVE INT,
IN NEWCHAVE INT)
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE vTabela_A VARCHAR(100) DEFAULT '';
DECLARE vCampo_A VARCHAR(100) DEFAULT '';
DECLARE cTabela CURSOR FOR SELECT TABELA_A, CAMPO_A FROM VIEW_RELACIONAMENTOS WHERE TABELA_B = 'LISTAS';

OPEN cTabela;

read_loop: LOOP
#aqui você pega os valores do "select", para mais campos vocÇe pode fazer assim:
#cTabela INTO c1, c2, c3, ..., cn
FETCH cTabela INTO vTabela_A, vCampo_A;
IF done THEN
LEAVE read_loop;
END IF;

SET @SQL_T = CONCAT('UPDATE ', vTabela_A, ' SET ', vCampo_A, ' = ', NEWCHAVE);
PREPARE ACAO FROM @SQL_T;
EXECUTE ACAO;

END LOOP;

CLOSE cTabela;
END $$

DELIMITER ;

Porém dá erro quando chamo a procedure CALL pTeste(2, 12)

You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Queries and reconnect. 0.000 sec

E também em uma conversa com um parceiro, ele me convenceu a fazer estes procedimentos pelo PHP, por questões de migração de servidor de banco de dados.

Mas, desde já obrigado pela atenção.




6. Re: Percorrer View e montar SQL dinamicamente [RESOLVIDO]

Guilherme
guipsp

(usa Ubuntu)

Enviado em 04/06/2013 - 15:29h

Fazer pela programação fora do banco pode ser uma boa alternativa.

Sobre a mensagem. Tente colocar da seguinte forma.


DELIMITER $$

SET SQL_SAFE_UPDATES=0 $$

...

SET SQL_SAFE_UPDATES=1 $$

DELIMITER ;


ou antes de chamar o pTeste(1,2); faça


SET SQL_SAFE_UPDATES=0;
CALL pTeste(1,2);
SET SQL_SAFE_UPDATES=1;



7. Re: Percorrer View e montar SQL dinamicamente [RESOLVIDO]

Silvério Coelho Sepulveda
isilver

(usa CentOS)

Enviado em 04/06/2013 - 16:27h

Show de bola, pus o SQL_SAFE_UPDATE = 0 e depois = 1 dentro da própria procedure.

Agora aproveitando, deixa trocar uma idéia, o que acha mais estável, fazer via php ou fazer via procedimento no banco de dados/

Desde já obrigado.


8. Re: Percorrer View e montar SQL dinamicamente [RESOLVIDO]

Silvério Coelho Sepulveda
isilver

(usa CentOS)

Enviado em 04/06/2013 - 17:18h

Show de bola, meu amigo, muito obrigado.

Forte Abraço.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts