Ir para conteúdo
Fórum Script Brasil
  • 0

SQL dentro de function/procedure


Marcio Dias

Pergunta

Como eu faço para executar um SQL criado dinamicamente.

Ex.:

CREATE FUNCTION banco.fcRetUltimoRegistro (campo char(30), tabela char(30) ) returns  int
BEGIN
        declare iSQL varchar(255);
        declare i_ultimo integer;
        
        //Eu quero executar o SQL criado abaixo, como eu faço isso?
        set iSQL = "Select max(" + campo + ")  into i_ultimo  from " + tabela;

        

        set i_ultimo = (i_ultimo + 1);
        
        return i_ultimo;
END;

Editado por Denis Courcy
Melhorar entendimento do código
Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Oi, 'Marcio Dias'

O MySQL só permite executar SQL dinamicamente em STORAGE PROCEDURE.

Poor isso modifiquei seu código para atender o que você quer. Veja abaixo:

DELIMITER $$;

DROP PROCEDURE IF EXISTS `meubanco`.`fcRetUltimoRegistro`$$

CREATE PROCEDURE `meubanco`.`fcRetUltimoRegistro` (campo char(30), tabela char(30), out i_ultimo integer )
BEGIN
        set @iSQL = concat("Select max(", campo, ")  into @ultimo  from ", tabela);
        prepare stmt from @iSQL;
        execute stmt;
        drop prepare stmt;

        set i_ultimo = (@ultimo + 1);
END$$

DELIMITER;$$
Os testes foram baseados em minha tabela de testes chamada clientes. Veja abaixo a execução:
select max(matricula ) from cliente;
Retornou 323986. Executando sua procedure
Call fcRetUltimoRegistro('matricula', 'cliente', @num);
select @num;

Retornou 323987.

Link para o comentário
Compartilhar em outros sites

  • 0

Valeu pela ajuda.

Nem os comandos abaixo eu posso incluir em uma function, para retornar o resultado do @num?

Call fcRetUltimoRegistro('matricula', 'cliente', @num);

select @num;

A minha intenção era criar procedures e funções no banco para que não fique tudo na aplicação, então por exemplo se eu tiver criando uma view ou até mesmo um SQL para fazer uma conversão de dados ou um relatório no sistema, achei que eu poderia fazer assim:

Select seq = fcReUltimoRegistro('matricula', 'cliente'),

nome = fieldqualquer

from clientes

Link para o comentário
Compartilhar em outros sites

  • 0

Oi, 'Marcio Dias'

... posso incluir em uma function, para retornar o resultado do @num?
Pode sim.

Neste caso, @num deverá ser declarado dentro da função com o nome de "num" sem o "@"

Link para o comentário
Compartilhar em outros sites

  • 0

A função como eu queria, mas continua dizendo que não é possível a utilização de query dinamica.

CREATE FUNCTION fcRetUltimoRegistro (campo char(30), tabela char(30)) returns int

BEGIN

DECLARE num integer;

Call prRetUltimoRegistro(campo, tabela, num);

return num;

END

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...