Ir para conteúdo
Anselmo De Oliveira Alves

Usando variavel na clausula IN

Recommended Posts

Bom dia Pessoal,

Me deparei com uma situação que a principio julguei ser simples, porém, não consigo resolver e preciso de ajuda.

Criei uma procedure, nela recebo umas variáveis normalmente, uma delas é uma string com os números dos ct-e que devo processar nessa procedure. Entretanto a consulta usando essa string numa clausula IN não retorna nenhum registro, mas colocando na mão, retorna todos. 

Fiz uma versão reduzida da minha procedure para mostrar o problema:

 

DELIMITER $$

DROP PROCEDURE IF EXISTS `teste_insercao`$$
CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    PROCEDURE `of_logistica`.`teste_insercao`(IN oNumCtrcs VARCHAR(200))
    BEGIN
    DECLARE varteste CHAR(200);
    
    DROP TEMPORARY TABLE IF EXISTS tbTMP_Cte_impressao;

    CREATE TEMPORARY TABLE tbTMP_Cte_impressao(
        _cod_emp       VARCHAR(3),
        _cod_fil       VARCHAR(3),
        _num_ctrc     VARCHAR(6),
        _serie_ctrc VARCHAR(3),
        _xml_cte        TEXT,
        _processado   INT
    );
    SET varteste = CONVERT(REPLACE(SUBSTRING(oNumCtrcs, 1,LENGTH(oNumCtrcs)), '|', ',') USING UTF8);
  # faz o select para buscar todos os ctes que serão impressoas e insere na tabela temporária
  INSERT INTO tbTMP_Cte_impressao (SELECT tbtms_ctrc.cod_emp, tbtms_ctrc.cod_fil, tbtms_ctrc.num_ctrc, tbtms_ctrc.serie_ctrc,
  cte_xml.xml_homologado, 0 FROM tbtms_ctrc
  LEFT JOIN tbtms_ctrc_xml cte_xml ON cte_xml.cod_emp = tbtms_ctrc.cod_emp
                                 AND cte_xml.cod_fil = tbtms_ctrc.cod_fil
                                 AND cte_xml.num_ctrc = tbtms_ctrc.num_ctrc
                                 AND cte_xml.serie_ctrc = tbtms_ctrc.serie_ctrc
  WHERE tbtms_ctrc.cod_emp = '004' AND tbtms_ctrc.cod_fil = '001' AND
#  tbtms_ctrc.num_ctrc IN ( REPLACE(SUBSTRING(oNumCtrcs, 1,LENGTH(oNumCtrcs)), '|', ',')) order by tbtms_ctrc.num_ctrc);
  tbtms_ctrc.num_ctrc IN (varteste) ORDER BY tbtms_ctrc.num_ctrc);
#SELECT REPLACE(SUBSTRING("'048418'|'048419'|'048420'|'048421'", 1, LENGTH("'048418'|'048419'|'048420'|'048421'")), '|', ',');

    END$$

DELIMITER ;

 

Na chamada da procedure estou fazendo assim: CALL teste_insercao("'048418'|'048419'|'048420'|'048421'");

 

Já tentei várias coisas, conversões, mas não consegui resolver essa questão

 

Fiz alguns testes utilizando a consulta fora da procedure e não consegui resolver. 

SET @ctrc = "'048418','048419','048420','048421'";
#SET @ctrc = "048418,048419,048420,048421";

SELECT @ctrc;
SELECT tbtms_ctrc.cod_emp, tbtms_ctrc.cod_fil, tbtms_ctrc.num_ctrc, tbtms_ctrc.serie_ctrc,
 cte_xml.xml_homologado FROM tbtms_ctrc  
 LEFT JOIN tbtms_ctrc_xml cte_xml ON cte_xml.cod_emp = tbtms_ctrc.cod_emp  
                                 AND cte_xml.cod_fil = tbtms_ctrc.cod_fil  
                                 AND cte_xml.num_ctrc = tbtms_ctrc.num_ctrc  
                                 AND cte_xml.serie_ctrc = tbtms_ctrc.serie_ctrc 
WHERE tbtms_ctrc.cod_emp = '004' AND tbtms_ctrc.cod_fil = '001' AND 
tbtms_ctrc.num_ctrc IN (@ctrc);

 

Vocês sabem se é possível usar uma variável na clausula IN, tem algum exemplo que possam me demonstrar?

 

Obrigado

 

Anselmo

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por Carlos Primo
      Olá, fiz um código VBA Sql para consultar dados de uma tabela e atribuí os valores dos dados em 3 variveis, porem uma das váriaveis não funciona corretamente.
      Os dados desta variavel que não funciona possui letras e números, pois os dados da tabela referente a esta variavel possui letras e números.
      Quando coloco o valor direto dentro do select o código funciona, mas com variável não da certo.
      Também funciona quando retiro esta variável.
      No código, o nome da variável é PREFIX
       
      O erro que aparece é esse:
      Run-time error '-2147217900 (80040e14)':
      [Microsoft][ODBC SQL Server Driver]  Invalid column name 'Y18HW'.

       
      Segue o código:
       
      Sub sb_RetornaConsulta()
       
      Application.ScreenUpdating = False
         
          Dim obj_Connection As New ADODB.Connection
          Dim obj_RecordSet As New ADODB.Recordset
          Dim str_SQL As String
          Dim str_PlanilhaDestino As String
          Dim str_ConnString As String
          Dim str_LinhaInicial As String
          Dim nr_coluna As Integer
          Dim Prefix As Variant
          Dim S_Inicia As Variant
          Dim S_Fina As Variant
          
           Prefix = frm_Serie.Pref.Value        'Valor do prefixo digitado no textbox da userform = Y18HW 
           S_Inicia = frm_Serie.S_Inicial.Value 'Valor do Inicial digitado no textbox da userform = 177781 
           S_Fina = frm_Serie.S_Final.Value     'Valor do Final digitado no textbox da userform = 179780
                
          str_PlanilhaDestino = "Resultado"
          str_ConnString = "Driver={SQL Server};server=NOME DO SERVER; Database=NOME DA BASE; UID=USUÁRIO;PWD=SENHA"
          str_LinhaInicial = 3
          
          
          
          str_SQL = "SELECT TABELA.NRSerie AS Serie, TABELA.BancadaID AS Bancada, " & _
                      " TABELA.ResQn AS Qn, TABELA.ResQt AS Qt, " & _
                      " TABELA.ResQm AS Qm, TABELA.Data AS [Data Produção] " & _
                      " FROM TABELA " & _
                      " WHERE TABELA.Serie >= " & S_Inicia & " " & _
                      " AND TABELA.Serie <= " & S_Fina & " "
                      " AND Tabela.Prefixo = " & Prefix & " " & _
                      " ORDER BY TABELA.NRSerie DESC "
              
          ' Limpa dados
          Sheets(str_PlanilhaDestino).Select
          Cells.Select
          Selection.ClearContents
          Range("A1").Select
       
          ' Executa query no SQL
          obj_Connection.Open str_ConnString
          obj_RecordSet.Source = obj_Connection
          obj_RecordSet.Open str_SQL, obj_Connection
              
          ' Inclui cabeçalhos da query:
          For nr_coluna = 0 To obj_RecordSet.Fields.Count - 1
              Worksheets(str_PlanilhaDestino).Cells(str_LinhaInicial, nr_coluna + 1).Value = obj_RecordSet.Fields(nr_coluna).Name
          Next
           
          ' Salva dados no Excel
          Sheets(str_PlanilhaDestino).Cells(CInt(str_LinhaInicial + 1), 1).CopyFromRecordset obj_RecordSet
       
          ' Finaliza conexão e objetos
          obj_RecordSet.Close
          obj_Connection.Close
          Set obj_RecordSet = Nothing
          Set obj_Connection = Nothing
           
           
           Application.ScreenUpdating = True
           
           frm_Serie.Hide
           
      End Sub
    • Por rodrigo antonio cruz
      Olá amigos, estou com uma dúvida que acredito ser bem básica, porém nunca precisei fazer isso, o problema é o seguinte: Tenho duas variáveis de conexao que sao do tipo privadas, quero que essas duas variáveis recebam os parametros como Token, e email, que vai vir do banco mysql, o problema é que nao to conseguindo fazer essas duas var receber os parametros, segue o código:
      <?php class Config{ //AQUI PRECISO PASSAR O EMAIL E TOKEN QUE VEM DO BD, O PROBLEMA N E NA CONSULTA MYSQL, E SIM EM COMO FAZER ESSAS DUAS PRIVATES RECEBEREM OS PARAMETROS private static $email = "rodrigocruz@hotmail.com"; private static $tokenProduction = "B5EF3B332329F50AB4298928950A52FCB1CE245C"; private static $sandbox = false; private static $tokenSandbox = ""; public static function getEmail(){ return self::$email; } public static function getToken(){ return self::isSandbox() ? self::$tokenSandbox : self::$tokenProduction; } public static function isSandbox(){ return self::$sandbox; } public static function setSandbox(){ self::$sandbox = true; } public static function setProduction(){ self::$sandbox = false; } public static function setAccountCredentials($email, $token, $isSandbox = true){ self::$email = $email; if($isSandbox === true) { self::setSandbox(); self::$tokenSandbox = $token; }else{ self::setProduction(); self::$tokenProduction = $token; } } }  
    • Por Alexandrephp
      Passar uma variavel json ou xml para php?
        var tempo = response.rows[0].elements[0].duration.te... 
      tempo = tempo.replace("day", "dia").replace("hour", "hora").replace("min", "min");   preciso colocar essa variavel em php   exemplo  $("#<? echo $tempo;?>").val(tempo); /// aqui consigo enviar para uma textbox. mas eu quero em php apenas uma variavel, ou session
    • Por Nova Ourora
      <div class="card-block"> <div class="card-block"> <form class="form-inline"> <select class="form-control" id="nmProduto" style="max-width: 300px;"> <option value="">Selecione o Produto</option> <option>SUPORTE PARA CARIMBO DE MADEIRA COM 06</option> <option>BOTON PERSONALIZADO - SESMT</option> <option>RELOGIO DESPERTADOR 0 A 60 MIN.</option> </select> Quero que esta DIV pegue os valores de uma variável (que fica na tabela produtos).
      PARECE SIMPLES MAIS TA DIFÍCIL
    • Por PeeWee
      Preciso somar os valores que estáo na tabela tempo_servico, para utiliza-la posteriormente em uma validação de um determinado campo, estou fazendo da seguinte forma:
      $tempoDoServico = mysqli_query($conn, "SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(tempo_servico))) FROM agendamento WHERE dia = '$diaAgendado' "); $tempoDoServico2 = mysqli_fetch_row($tempoDoServico);                      $time2= $tempoDoServico2[0];  $parts2=explode(':',$time2);  $seconds2 = ($parts2[0]*60) + $parts2[1];  $total2 = $seconds2 * 1;    //este numero 1 serve para outra coisa que no momento não nos interessa. O que ocorre é, quando há algum valor registrado na tabela, o código funciona normalmente, mas se não há nenhum valor ele exibe um erro (Notice: Undefined offset: 1 in ) isto em relação a variavel $parts2[1]. Só que sempre vai ocorrer desse registro estar vazio na primeira vez, após o primeiro usuario cadastrar sua consulta ele não exibirá mais erros. Não sei exatamente o que fazer, pois nao estou conseguindo entender, se está vazio ele simplesmente não deveria fazer nada e nao ficar exibindo erro. Espero que alguém mais experiente com PHP possa me ajudar. 
×

Informação importante

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