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

(Resolvido) Função com query usando PARÂMETROS


Spyder.RV

Pergunta

Boa tarde galera!!!!!

Preciso montar uma função pra verificar se existe um registro numa tabela, porém, preciso passar por parâmetros o seguinte:

Nome da tabela, nome do campo de chave primária e o valor da chave primária... Então montar a consulta e retornar se existe ou não.

Assim eu consigo consultar a existencia de um registro em qualquer tabela que tenha chave primária inteira.

-- ------------------------------------------------------------------------------------------------------------
 -- FUNCAO: validarRegistro
 -- DESCRIÇÃO: Valida se existe um registro específico em uma tabela específica, através da chave primária
 -- IMPORTANTE: A chave Primária tem que ser do tipo INT
 -- ------------------------------------------------------------------------------------------------------------
 CREATE FUNCTION validarRegistro( v_tabela VARCHAR(255), v_nomePK VARCHAR(255), v_valorPK INT) RETURNS BOOL
 BEGIN
         
         RETURN ( (SELECT COUNT(*) FROM v_tabela WHERE v_nomePK = v_valorPK) = 0 );
         
 END;$

quando rodo a função, recebo a mensagem abaixo:

SELECT validarRegistro('usuario', 'codUsuario', 101);

SQL execution error #1146. Response from the database:

Table 'winmodel.v_tabela' doesn't exist

O que eu quero é que seja usado o NOME DA TABELA que está no parâmetro e não o próprio parâmetro.

Como fazer isso?

Editado por Denis Courcy
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Oi 'Spyder.RV' !

Neste caso você precisa criar o SQL em tempo de execução. Isto é feito através de um comando chamado PREPARE que só roda em STORAGE PROCEDURE.

Storages procedures possuem parâmetros que podem ser IN, OUT e INOUT.

Os parâmetros IN são parâmetros de valores. Ou seja a procedure recebe o valor no parâmetro e não retorna nenhuma informação.

Os parâmetros OUT são parâmetros que são alimentados pela procedure e podem ser usados por você em outra tarefa

Os parâmetros INOUT são passados por referência, ou seja a procedure recebe o valor, trata o valor e devolve o valor tratado no mesmo parâmetro.

Leia no manual do MySQL, o tópico SQL Syntax for Prepared Statements.

Abaixo, seu código adaptado a meu banco de testes

A procedure

DELIMITER $$;
DROP PROCEDURE IF EXISTS `test`.`validarRegistro`$$
CREATE procedure  validarRegistro(IN v_tabela VARCHAR(255), IN v_nomePK VARCHAR(255), IN v_valorPK INT, OUT retorno INT)
BEGIN
   SET     @MeuSQL = CONCAT('SET @Result = (SELECT COUNT(*) FROM ', v_tabela, ' WHERE ', v_nomePK, ' = ', v_valorPK, ')');
   PREPARE stmt1 FROM @MeuSQL;
   EXECUTE stmt1;
   DEALLOCATE PREPARE stmt1;
   SET retorno = @Result;   
END$$
DELIMITER;$$
A chamada
set @ret = 99;
call validarRegistro('ator', 'idator', 1, @ret);
select @ret;

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...