Como concatenar um comando SQL dentro de uma MySQL Stored Procedure? – php mysql
Pergunta:
Na mostra a seguir, temos um exemplo já rodando em PHP.
O cenário da questão é a montagem de um “link de navegação” baseado numa estrutura de dados.
$node = '006002009'; // Esta informação é obtida dinamicamente.
$segmentos = strlen($node)/3;
$sql = 'SELECT ACESSO_SCRIPT FROM ACESSO_ADMIN WHERE ACESSO_NIVEL';
$or = '';
Loop de concatenação do comando SQL
for($x = 0; $x < $segmentos; $x++){
$comp = $x+1;
$sql.= $OR.'="'.substr($node,0,($indent*$comp)).'" ';
$or = ' OR ACESSO_NIVEL';
}
O resultado do loop gera a string:
SELECT ACESSO_SCRIPT FROM ACESSO_ADMIN WHERE ACESSO_NIVEL="006" OR ACESSO_NIVEL="006002" OR ACESSO_NIVEL="006002009"`
O desafio é conseguir a mesma concatenação do loop acima, dentro da Stored Procedure.
Lembrando que a SP receberia como parâmetro apenas o valor de $node. Esse valor é de comprimento variável e segue uma regra de composição em segmentos de 3 algarismos.
Autor da pergunta Bertonni Magnus
Adir Kuhn
Acho que algo assim deva resolver seu problema:
CREATE PROCEDURE batata(node CHAR(30))
BEGIN
DECLARE segmentos INT;
DECLARE jump INT;
DECLARE contador INT;
SET segmentos = LENGTH(node) / 3;
SET jump = segmentos;
SET contador = 1;
SET @sql = 'SELECT ACESSO_SCRIPT FROM ACESSO_ADMIN WHERE ACESSO_NIVEL=';
SET @sql = CONCAT(@sql, '"', node, '"', ' ');
WHILE contador < segmentos DO
SET @sql = CONCAT(@sql, 'OR ACESSO_NIVEL=', '"', SUBSTR(node, 1, jump), '"', ' ');
SET contador = contador + 1;
SET jump = jump * contador;
END WHILE;
PREPARE STMT FROM @sql;
EXECUTE STMT;
END
Update:
Quanto a lógica não tem segredo está sendo utilizado o mesmo esquema que o do exemplo.
Criei uma procedure que espera uma variável que será chamada de ‘node’ do tipo char(30) (se precisar de uma string maior basta aumentar esse número)
Dentro da procedure tem 4 variaveis
segmento que vai calcular o número de segmentos do ‘node’ (node/3)
jump variavel usada para pegar parte do conteúdo da string com substr
contador pra fazer o controle do loop while
e sql que vai conter a string da SQL
apos setar o conteúdo inicial do @sql (SET @sql = ‘SELECT ACESSO_SCRIPT FROM ACESSO_ADMIN WHERE ACESSO_NIVEL=’;)
vou utilizando o comando do mysql CONCAT para concatenar as string de acordo com a lógica necessária.
Após o loop a query sql estará completa,
ai bastar preparar o statement a partir da variável @sql e executar
PREPARE STMT FROM @sql;
EXECUTE STMT;
se quiser debugar e ver a string basta apagar as linhas prepare ... e execute ... e por select @sql;



