Jump to content


Photo

Função Com Query Usando Parâmetros


  • Faça o login para participar
9 replies to this topic

#1 Spyder.RV

Spyder.RV

    Turista

  • Usuários
  • 54 posts
  • Sexo:Masculino
  • Localidade:Rio Verde - GO

Posted 31/01/2011, 09:51

Bom dia 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 o valor 'usuario' esteja na consulta e não o próprio parâmetro.

Como fazer isso?

Edição feita por: Spyder.RV, 31/01/2011, 09:52.

Wemerson C. Guimaraes
Rio Verde - GO
C2Q Q6600 + Asus P5KPL + 4GB DDR2 PC6400 + ATI X1650 512 DDR2 + 570 GB HD

#2 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 31/01/2011, 11:46

Chutando:

CREATE FUNCTION validarRegistro( v_tabela VARCHAR(255), v_nomePK VARCHAR(255), v_valorPK INT) RETURNS BOOL
BEGIN

PREPARE consulta FROM CONCAT("SELECT EXISTS(SELECT * FROM ", v_tabela, " WHERE ", v_nomePK, " = ", v_valorPK, ") INTO @resultado");
EXECUTE consulta;
DEALLOCATE PREPARE consulta;

RETURN @resultado;

END;


#3 Spyder.RV

Spyder.RV

    Turista

  • Usuários
  • 54 posts
  • Sexo:Masculino
  • Localidade:Rio Verde - GO

Posted 31/01/2011, 18:09

Chutando:

CREATE FUNCTION validarRegistro( v_tabela VARCHAR(255), v_nomePK VARCHAR(255), v_valorPK INT) RETURNS BOOL
BEGIN

PREPARE consulta FROM CONCAT("SELECT EXISTS(SELECT * FROM ", v_tabela, " WHERE ", v_nomePK, " = ", v_valorPK, ") INTO @resultado");
EXECUTE consulta;
DEALLOCATE PREPARE consulta;

RETURN @resultado;

END;


Estou usando o Mysql_Workbench 5.2.31 CE pra fazer a modelagem e criar todas as Storeds e Funções... tá acusando erro na linha do PREPARE.... Porém não informa que erro é esse... somente acusa que a linha é inválida.

Consegui!!!!

Triggers e Functions não aceitam sql dinâmico... Somente Stored Procedures...

Então montei a SP assim:

CREATE PROCEDURE spValidaRegistro( v_tabela VARCHAR(255), v_nomePK varchar(255), v_valorPK INT)
BEGIN
    SET @sqlValida = CONCAT("SELECT EXISTS(SELECT * FROM ", v_tabela, " WHERE ", v_nomePK, " = ", v_valorPK, ") INTO @retorno");
    
    PREPARE consulta FROM @sqlValida;
    EXECUTE consulta;
    DEALLOCATE PREPARE consulta;
END;$$

Trabalhamos em equipe dividida, layout, lógica e dados... e toda a manipulação pesada de dados é feita em storeds, triggers e functions...

No caso da validação do registro, quando for necessária, basta dar um CALL nessa sp e logo após usar o @retorno pois o estado permanece na SP que chamar o spValidaRegistro.

Seria mais interessante se tivesse em função por conta do retorno, mas do jeito que tá pra nós é o bastante.

Agradeço a ajuda... apesar de ser um "chute".... foi um belo chute parceiro... graças a ele consegui encontrar o que fazer!
Wemerson C. Guimaraes
Rio Verde - GO
C2Q Q6600 + Asus P5KPL + 4GB DDR2 PC6400 + ATI X1650 512 DDR2 + 570 GB HD

#4 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 01/02/2011, 07:52

Pode fazer com que o valor seja retornado direto na SP mesmo.

    EXECUTE consulta;
DEALLOCATE PREPARE consulta;
SELECT @retorno;
END;$$


#5 Spyder.RV

Spyder.RV

    Turista

  • Usuários
  • 54 posts
  • Sexo:Masculino
  • Localidade:Rio Verde - GO

Posted 02/02/2011, 07:39

Pode fazer com que o valor seja retornado direto na SP mesmo.

    EXECUTE consulta;
DEALLOCATE PREPARE consulta;
SELECT @retorno;
END;$$


é sim... fiz os testes e deu certo... o problema é que ao final da execução da SP nós sempre temos um select padrão, que é o retorno da operação realizada...

Se for uma SP só pra visualização de dados, o resultado é a própria consulta... se for uma SP pra fazer uma inserção em lote ou uma alteração de dados por exemplo, sempre tem um SELECT no final, onde retornamos se houve sucesso ou não e as mensagens de erro.

E muitas vezes temos SPs chamando SPS (seriam só funções se aceitassem sql dinâmico)... aí se retornar um SELECT da segunda SP, meu resultado final seriam 2 (ou mais) QUERYS e bagunçaria o retorno.

Então o melhor é só instanciar uma variável @retorno e usá-la na primeira SP.
Wemerson C. Guimaraes
Rio Verde - GO
C2Q Q6600 + Asus P5KPL + 4GB DDR2 PC6400 + ATI X1650 512 DDR2 + 570 GB HD

#6 LarPhozyHah

LarPhozyHah

    Super Veterano

  • Usuários
  • 14515 posts
  • Sexo:Masculino
  • Localidade:San Miguel de Tucuman

Posted 26/09/2017, 20:29

Generic Super Viagra Pill Cialis 10 Mg Prezzo Canadian Pharmacy Prednisone cialis price Buy Zithromax Online Overnight Shipping Levitra Rezeptfrei Niederlande

#7 LarPhozyHah

LarPhozyHah

    Super Veterano

  • Usuários
  • 14515 posts
  • Sexo:Masculino
  • Localidade:San Miguel de Tucuman

Posted 06/10/2017, 01:50

Hives Infant Reaction Side Effect Amoxicillin online pharmacy Drug Shelf Life Of Cephalexin
Propecia Mercado Libre Worldwide Bentyl Secure Discount generic levitra online pharmacy Drinking With Amoxicillin 500mg Cap Cialis 2.5 Mg From Canada Precios De Cialis

#8 LarPhozyHah

LarPhozyHah

    Super Veterano

  • Usuários
  • 14515 posts
  • Sexo:Masculino
  • Localidade:San Miguel de Tucuman

Posted 21/10/2017, 19:04

Trusted Mens Meds Discount Plavix Coupons viagra purchase isotretinoin without rx I Want To Buy Amitriptyline 50 Mg Cephalexin And Cipro Interactions
Cheap Lavitra Kamagra Fur Die Frau viagra Cialis C20 Preis Vibramycin
Cialis Precio Espana Buy Propecia In The Us Prix Du Tadalis Sx viagra Periactin Weight Gain Propecia Generica De Farmacias Generic Name Propecia

#9 LarPhozyHah

LarPhozyHah

    Super Veterano

  • Usuários
  • 14515 posts
  • Sexo:Masculino
  • Localidade:San Miguel de Tucuman

Posted 31/10/2017, 22:08

Pharmacocinetique De La Ciprofloxacine viagra Buy Generic Fluoxetine Visa Shop Cialis Sur Internet Avis Online Clomid Cheap
Glucovance Achat Viagra Femme Propecia Cost Buy online pharmacy Propecia Mb Cialis 12 Kaufen

#10 LarPhozyHah

LarPhozyHah

    Super Veterano

  • Usuários
  • 14515 posts
  • Sexo:Masculino
  • Localidade:San Miguel de Tucuman

Posted 29/11/2017, 10:36

Online Pharmacxy Kamagra Generika Com viagra Acheter Cialis En Suisse Viagra Y Cialis Mejor




0 user(s) are reading this topic

0 membro(s), 0 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq