Para os desenvolvedores, tabelas temporárias são uma "mão-na-roda" quando precisa-se manipular os mesmos dados e
mesma consulta várias vezes, principalmente em relatórios.
Só que há um problema: quando utiliza-se uma conexão orientada a objeto, por exemplo no PHP, que finalize a conexão ao
banco de dados, não há como executar várias consultas e retirar os dados.
Por exemplo: criando a tabela de usuários, vamos extrair os dados contidos nela.
Criando e inserindo dados no banco de dados
CREATE TABLE USUARIOS(
CODIGO INTEGER NOT NULL,
NOME VARCHAR(100) NOT NULL,
USUARIO VARCHAR(30) NOT NULL,
SENHA VARCHAR(128) NOT NULL
);
INSERT INTO USUARIOS() VALUES(1,'ARIEL','arieldll','anstds1120');
INSERT INTO USUARIOS() VALUES(2,'ALBERTO','aalt','1103858awp');
INSERT INTO USUARIOS() VALUES(3,'THAIS','thbp','widhxx945j');
---INÍCIO-DO-SQL-TEMPORARIO-PARA-RODAR-NO-BANCO---
DROP TABLE IF EXISTS TMP_TODOS_USUARIOS;
CREATE TEMPORARY TABLE TMP_TODOS_USUARIOS AS(
SELECT
*
FROM
USUARIOS
);
DROP TABLE IF EXISTS TMP_USUARIOS_2;
CREATE TEMPORARY TABLE TMP_USUARIOS_2 AS(
SELECT
*
FROM
TODOS_USUARIOS
WHERE
USUARIO like '%a%';
);
DROP TABLE IF EXISTS TMP_USUARIOS_3;
CREATE TEMPORARY TABLE TMP_USUARIOS_3 AS(
SELECT
*
FROM
TODOS_USUARIOS
WHERE
SENHA like '%1%';
);
SELECT
TMP_USUARIOS_3
UNION
TMP_USUARIOS_2;
-----FIM-DO-SQL-TEMPORARIO-PARA-RODAR-NO-BANCO----
Função para enviar/separar/receber dados
Bom, caso tenta-se rodar este 'sql' em uma conexão que depois executa o 'mysql_close()', acabará por não manter a tabela
temporária, pois ela será excluída automaticamente pelo banco quando a conexão cair.
Mas, para resolver este pequeno problema, desenvolvi uma função simples que ajudará:
<?php
$Con_local;
function Busca_separa_query($Query){
global $Con_local; //DEFINE A VARIÁVEL $Con_local como do escopo global
$Consultas=explode(";", $Query); //DIVIDE AS CONSULTAS (GERA UM VETOR)
APARTIR DE ; (PONTO-E-VÍRGULA)
$Con_local=mysql_connect('Endereco_banco','usuario','senha'); //CONECTA AO
BANCO DE DADOS
mysql_select_db('Nome_da_base_de_dados', $Con_local); //SELECIONA A BASE DE
DADOS A SER UTILIZADA
for($Conta=1; $Conta<=count($Consultas); $Conta++){ //A FUNÇÃO count()
CONTA QUANTAS POSIÇÕES EXISTE NO VETOR, ENTÃO, VOCÊ PODE RESOLVÊ-LA COM VÁRIAS OUTRAS FORMAS
$rs_l=mysql_query($Consul
tas[$Conta-1], $Con_local); //EXECUTA A CONSULTA NO BANCO, RETORNANDO A ÚLTIMA CONSULTA EXECUTADA.
}
return $rs_l;
}
?>
Para utilizar a função, basta recebê-la em um variável, como por exemplo:
<?php
$resultado_usuarios=Busca_separa_query("DROP TABLE IF EXISTS TMP_TODOS_USUARIOS;
CREATE TEMPORARY TABLE TMP_TODOS_USUARIOS AS(
SELECT
*
FROM
USUARIOS
);
DROP TABLE IF EXISTS TMP_USUARIOS_2;
CREATE TEMPORARY TABLE TMP_USUARIOS_2 AS(
SELECT
*
FROM
TODOS_USUARIOS
WHERE
USUARIO like '%a%';
);
DROP TABLE IF EXISTS TMP_USUARIOS_3;
CREATE TEMPORARY TABLE TMP_USUARIOS_3 AS(
SELECT
*
FROM
TODOS_USUARIOS
WHERE
SENHA like '%1%';
);
SELECT
TMP_USUARIOS_3
UNION
TMP_USUARIOS_2;");
if(mysql_num_rows($resultado_usuarios)>0){
while($resultado=mysql_fetch_array($resultado_usuarios))){
echo 'Codigo: '.resultado["CODIGO"].'<br>';
echo 'Usuario: '.resultado["USUARIO"].'<br>';
echo 'Senha: '.resultado["SENHA"].'<br>';
}
}
Fechando a conexão e saindo
Agora, para fechar a conexão, basta simplesmente gerar outra conexão ou fechar manualmente cada vez.
<?php
mysql_close($Con_local);
?>
Ou:
<?php
function Fechar_temps(){
global $Con_local;
mysql_close($Con_local);
}
//E CHAMÁ-LA
Fechar_temps();
?>
Para outras bases de dados, pode-se também implementar, como por exemplo no PostGRES.
Caso necessite, pode implementá-la de várias maneiras. Ou, se tiver outra sugestão, estarei feliz por compartilhar ela
conosco.
Espero que isso ajude vários.
[]'s Ariel