Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

jmlavoier

[Resolvido] Executar vários blocos sql no mysql

Recommended Posts

Olá bom dia a todos !

 

Preciso executar vários blocos de comando sql (mysql) em um só @mysql_query.

Repare que existe dois blocos anteriores para criação de variaveis.

Eu preciso executar o comando desta maneira, em um script só. Só que desta maneira, o mysql_query não funciona.

 

  $comando = "SET @ddatai := str_to_date('01/05/2011', '%d/%m/%Y');
             SET @ddataf := str_to_date('31/12/2011', '%d/%m/%Y');
             SELECT * FROM CA_TESTE_RET_EFIC B 
             WHERE 
             AND date_format( B.DATA_CADASTRO, concat('01/%m/', extract(Year from SYSDATE())) ) 
             between date_format( @ddatai , concat('01/%m/', extract(Year from SYSDATE()))) 
             AND date_format( @ddataf , concat('01/%m/', extract(Year from SYSDATE())));";


  $rs_teste = @mysql_query($comando,$con_teste);

 

Fiz o teste dest maneira e funcionou corretamente, mas não posso adaptar desse jeito.

 


  $comando = "SET @ddatai := str_to_date('01/05/2011', '%d/%m/%Y')";
  @mysql_query($comando,$con_teste);
  $comando = "SET @ddataf := str_to_date('31/12/2011', '%d/%m/%Y')";
  @mysql_query($comando,$con_teste);

  $comando = "SET @ddatai := str_to_date('01/05/2011', '%d/%m/%Y');
             SET @ddataf := str_to_date('31/12/2011', '%d/%m/%Y');
             SELECT * FROM CA_TESTE_RET_EFIC B 
             WHERE 
             AND date_format( B.DATA_CADASTRO, concat('01/%m/', extract(Year from SYSDATE())) ) 
             between date_format( @ddatai , concat('01/%m/', extract(Year from SYSDATE()))) 
             AND date_format( @ddataf , concat('01/%m/', extract(Year from SYSDATE())));";


  $rs_teste = @mysql_query($comando,$con_teste);

 

 

No aguardo de uma solução. Obrigado !

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe-me por não ter escrito de forma clara.

 

O problema é, tenho o seguinte script sql.

  SET @ddatai := str_to_date('01/05/2011', '%d/%m/%Y');
  SET @ddataf := str_to_date('31/12/2011', '%d/%m/%Y');
  SELECT * FROM CA_TESTE_RET_EFIC B 
  WHERE 
  AND date_format( B.DATA_CADASTRO, concat('01/%m/', extract(Year from SYSDATE())) ) 
  between date_format( @ddatai , concat('01/%m/', extract(Year from SYSDATE()))) 
  AND date_format( @ddataf , concat('01/%m/', extract(Year from SYSDATE())));

 

Percebe-se que o script possui três blocos de comando sql, sendo o primeiro bloco de comando:

SET @ddatai := str_to_date('01/05/2011', '%d/%m/%Y');

O segundo:

SET @ddataf := str_to_date('31/12/2011', '%d/%m/%Y');

E o tereiro bloco é:

SELECT * FROM CA_TESTE_RET_EFIC B 
  WHERE 
  AND date_format( B.DATA_CADASTRO, concat('01/%m/', extract(Year from SYSDATE())) ) 
  between date_format( @ddatai , concat('01/%m/', extract(Year from SYSDATE()))) 
  AND date_format( @ddataf , concat('01/%m/', extract(Year from SYSDATE())));

 

Eu preciso executar esta consulta no php, mas o mysql_query() parece só executar um bloco por vez, contudo o script não funciona: Exemplo 1

  $comando = "SET @ddatai := str_to_date('01/05/2011', '%d/%m/%Y');
             SET @ddataf := str_to_date('31/12/2011', '%d/%m/%Y');
             SELECT * FROM CA_TESTE_RET_EFIC B 
             WHERE 
             AND date_format( B.DATA_CADASTRO, concat('01/%m/', extract(Year from SYSDATE())) ) 
             between date_format( @ddatai , concat('01/%m/', extract(Year from SYSDATE()))) 
             AND date_format( @ddataf , concat('01/%m/', extract(Year from SYSDATE())));";


  $rs_teste = @mysql_query($comando,$con_teste);

 

Então eu fiz um teste desta maneira e funcionou: Exemplo 2

  $comando1 = "SET @ddatai := str_to_date('01/05/2011', '%d/%m/%Y');";
  @mysql_query($comando1,$con_teste);

  $comando2 = "SET @ddataf := str_to_date('31/12/2011', '%d/%m/%Y');";
  @mysql_query($comando2,$con_teste);

  $comando = "SELECT * FROM CA_TESTE_RET_EFIC B 
              WHERE 
              AND date_format( B.DATA_CADASTRO, concat('01/%m/', extract(Year from SYSDATE())) ) 
              between date_format( @ddatai , concat('01/%m/', extract(Year from SYSDATE()))) 
              AND date_format( @ddataf , concat('01/%m/', extract(Year from SYSDATE())));";


  $rs_teste = @mysql_query($comando,$con_teste);

 

Mas não posso fazer desta maneira, tenho que arrumar um jeito de fazer esta consulta funcionar em um mysql_query() só, como tentei no exemplo 1, existe alguma forma de fazer isso ?

 

Espero ter conseguido explicar minha dúvida agora.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

e porque não faz assim, ao invés de usar variáveis

SELECT 
     * 
  FROM 
     CA_TESTE_RET_EFIC B  
  WHERE  
     date_format( B.DATA_CADASTRO, concat('01/%m/', extract(Year from SYSDATE())) )  
  between 
     date_format( str_to_date('01/05/2011', '%d/%m/%Y'), concat('01/%m/', extract(Year from SYSDATE())))  
  AND 
     date_format( str_to_date('31/12/2011', '%d/%m/%Y'), concat('01/%m/', extract(Year from SYSDATE())));

 

claro que existe forma melhor de se fazer essa operação, está dando muita volta para pouca coisa

Compartilhar este post


Link para o post
Compartilhar em outros sites

Victor, eu tinha pensado desta maneira, mas o problema é que estou trabalhando em um sistema que executa consultas sql não criadas por mim. O sistema possui um adminitrador para o supervisor criar consultas sql, para gerar relatórios. E eles estão me pedindo para que consiga executar vários blocos de comando. Eles me informaram que vão precisar, como neste exemplo que passei, foi somente um exemplo. Não fui muito feliz neste exemplo, mas acho que deu pra entender.

Compartilhar este post


Link para o post
Compartilhar em outros sites

não entendi muito bem, mais olha se é isso:

 

<?
$comando[1] = "SET @ddatai := str_to_date('01/05/2011', '%d/%m/%Y');";
$comando[2] = "SET @ddataf := str_to_date('31/12/2011', '%d/%m/%Y');";
$comando[3] = "SELECT * FROM CA_TESTE_RET_EFIC B 
              WHERE 
              AND date_format( B.DATA_CADASTRO, concat('01/%m/', extract(Year from SYSDATE())) ) 
              between date_format( @ddatai , concat('01/%m/', extract(Year from SYSDATE()))) 
              AND date_format( @ddataf , concat('01/%m/', extract(Year from SYSDATE())));";
for ($y = 0; ; $y++) {
   if ($y > 3) {
       break;
   }
$rs_teste = @mysql_query($comando[$y] ,$con_teste);
}
echo "Funções executadas";
?>

 

Me responda se é isso msmo pra minha pessoa nao ficar em duvida -kk ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas não posso fazer desta maneira

na verdade até pode sim.

 

; é um delimitador especial. você pode varrer a string inicial que recebeu, atrás do ;, quebrar em várias posições, e então executar uma a uma, até usando a idéia do loop.

 

 

a extensão mysql_ realmente não faz multiplas queries. Se você quiser fazer isso, precisa usar mysqli ou pdo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

éer o que eu passei aqui funcionou bunitinho .-. ee eu tinha esqecido de tirar as ';' mais corrigi isso.

Ai não funcionou ? :S

 

@edit

 

o script eu usei os comandos desse:

 

$comando1 = "SET @ddatai := str_to_date('01/05/2011', '%d/%m/%Y');";
  @mysql_query($comando1,$con_teste);

  $comando2 = "SET @ddataf := str_to_date('31/12/2011', '%d/%m/%Y');";
  @mysql_query($comando2,$con_teste);

  $comando = "SELECT * FROM CA_TESTE_RET_EFIC B 
              WHERE 
              AND date_format( B.DATA_CADASTRO, concat('01/%m/', extract(Year from SYSDATE())) ) 
              between date_format( @ddatai , concat('01/%m/', extract(Year from SYSDATE()))) 
              AND date_format( @ddataf , concat('01/%m/', extract(Year from SYSDATE())));";


  $rs_teste = @mysql_query($comando,$con_teste);

 

só adaptei:

 

<?
$comando[1] = "SET @ddatai := str_to_date('01/05/2011', '%d/%m/%Y');";
$comando[2] = "SET @ddataf := str_to_date('31/12/2011', '%d/%m/%Y');";
$comando[3] = "SELECT * FROM CA_TESTE_RET_EFIC B 
              WHERE 
              AND date_format( B.DATA_CADASTRO, concat('01/%m/', extract(Year from SYSDATE())) ) 
              between date_format( @ddatai , concat('01/%m/', extract(Year from SYSDATE()))) 
              AND date_format( @ddataf , concat('01/%m/', extract(Year from SYSDATE())));";
for ($y = 0; ; $y++) {
   if ($y > 3) {
       break;
   }
$rs_teste = @mysql_query($comando[$y] ,$con_teste);
}
echo "Funções executadas";
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado William e smloUIS, gostei da ideia de vocês, bacana mesmo.

 

Implementei desta maneira a ideia de vocês e funcionou legal.

$comando = "SET @ddatai := str_to_date('01/05/2011', '%d/%m/%Y');
           SET @ddataf := str_to_date('31/12/2011', '%d/%m/%Y');
           SELECT * FROM CA_TESTE_RET_EFIC B 
           WHERE 
           AND date_format( B.DATA_CADASTRO, concat('01/%m/', extract(Year from SYSDATE())) ) 
           between date_format( @ddatai , concat('01/%m/', extract(Year from SYSDATE()))) 
           AND date_format( @ddataf , concat('01/%m/', extract(Year from SYSDATE())))";

$comandos = explode(";",$comando);

foreach($comandos as $sql){
   $rs_teste = @mysql_query($sql,$con_teste);
}

 

Espero que desta maneira não ocorra problema. Acredito que não pois assim funciona todos os blocos retornando o resultset somente do ultimo.

 

Mas eu fiquei curioso em relação ao mysqli e pdo que o William comentou, eu estava vendo sobre o mysqli, parece ser bem interessante, gostaria de saber onde encontro material para estudar estes componentes fora o php.net.

 

Vlw galera, abraço a todos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.