Schasta

Design + Anime + Manga + RPG + Programação

  • RSS
  • Delicious
  • Facebook
  • Twitter

Select in erro com variável na Procedure

Posted by schasta fevereiro - 7 - 2013 0 Comment

Enquanto montava uma procedure me deparei com um erro bizarro em uma procedure. Mas, antes de falar do erro, vamos falar dos termos que serão utilizados nesse post.

Procedures (Stored Procedure) é parecida com uma função que recebe e retorna parâmetros, onde você pode fazer diversos cálculos, a fim de executar tarefas repetitivas e manter o código SQL bem longe da linguagem de programação (PHP por exemplo).

Em uma procedure você pode executar vários selects, utilizando resultados de um select dentro de outro, criar variáveis globais para serem utilizadas nos selects, ou seja, tem uma infinidade de opções. Não é tão flexível como usar PHP, Java ou ASP na página, mas ajuda a organizar e manter os processos mais rápidos.

No meu caso, criei uma procedure para selecionar uma lista de emails, conforme o resultado de um select.

Criei o seguinte comando:

SET @v_status = ’1,2′;

SELECT ac.cod_cliente,
ac.cod_status,
CONCAT(ac.cod_cliente, “@schasta.com.br“) AS dsc_email,
UPPER(vc.nom_cliente) AS nom_cliente,
FROM acordo ac
INNER JOIN
v_cliente vc ON ac.cod_cliente = vc.cod_cliente
WHERE
ac.cod_status IN (@v_status)
ORDER BY cod_status ASC;

Para o meu espanto, o v_status dentro do in não funciona, ele reconhece somente o primeiro número no select…

Como resolver isso?

Partimos então para o select concatenado :)

SET @v_status = ’1,2′;

SET @v_sql = CONCAT(”

SELECT ac.cod_cliente,
ac.cod_status,
CONCAT(ac.cod_cliente, “@schasta.com.br“) AS dsc_email,
UPPER(vc.nom_cliente) AS nom_cliente,
FROM acordo ac
INNER JOIN
v_cliente vc ON ac.cod_cliente = vc.cod_cliente
WHERE
ac.cod_status IN (“,@v_status,”)
ORDER BY cod_status ASC;”);

/** EXECUTA O COMANDO */

PREPARE v_exec FROM @v_sql;
EXECUTE v_exec;
DEALLOCATE PREPARE v_exec;

Com isso ele procura nos dois códigos do v_status e traz todos os registros.

O @ na frente do v_status é para tornar ele global, assim você consegue utiliza-lo tanto dentro como fora de uma procedure, ótimo para testar os selects.

Outra curiosidade é que o v_cliente dentro do select é uma view. A utilização mais típica da view é quando você precisa buscar informações de outro banco de dados no mesmo servidor. Você monta uma view com o select necessário para trazer e juntar os dados do outro banco com os seus, organizando os dados no formato que você precisa para as consultas.

Esse post foi apenas para relatar o problema que tive no meu select hoje. Espero que seja útil para alguém.