Fórum Stored produre não retorna valor #398103

26/03/2011

0

Boa noite,
tentei usar a stored procedure abaixo mas o retorno é nome =
preciso que ela retorno o valor usando o operador like com o paremetro indicado.
Algume poderia me dar uma ajuda?



CREATE OR ALTER PROCEDURE consulta(pnome dm_nome)
returns (nome varchar(50))
as
begin
  select nomeusuario from usuario  WHERE NOMEUSUARIO LIKE '%:pnome%' into :nome;
    suspend;
end

Obrigado!
Nilo Souza

Nilo Souza

Responder

Posts

28/03/2011

Eliel Martins

  Olá Nilo !

  Eu verifiquei sua StoredProcedure e observei que está errada. O correto para você utilizar o Like com o sinal de % é da seguinte forma :
 
 CREATE OR ALTER PROCEDURE CONSULTA(PNOME DM_NOME) RETURNS (NOME VARCHAR(50))
 AS
 BEGIN
   SELECT NOMEUSUARIO FROM USUARIO  WHERE NOMEUSUARIO LIKE '%'|| :PNOME ||'%' INTO :NOME;
   SUSPEND;
 END
   
  Para concatenar o sinal de '%' você deve utilizar o pipe '||'.
       
  Outro detalhe que eu observei, é que você está utilizando o '%' antes do valor do parâmetro e depois, isso pode retorna vários registros e a sua StoredProcedure vai dar erro.

  Espero ter ajudado.
 
  Abraço.


  Eliel G. Martins 
Responder

Gostei + 0

28/03/2011

Nilo Souza

Fiz da forma abaixo e executei assim: EXECUTE PROCEDURE consulta('a').
Dessa forma me retorna mais colunas e realmente eu preciso que retorne varias linhas, neste caso eu precisarei usar o sect simples.

Deu esse erro:
can't format message 13:189 -- message file C:\Windows\firebird.msg not found.
multiple rows in singleton select.
At procedure 'CONSULTA' line: 5, col: 4.


 CREATE OR ALTER PROCEDURE CONSULTA(PNOME DM_NOME)
 RETURNS (NOME VARCHAR(50))
 AS
 BEGIN
   SELECT NOMEUSUARIO FROM USUARIO  WHERE NOMEUSUARIO LIKE '%'|| :PNOME INTO :NOME;
   SUSPEND;
 END
Responder

Gostei + 0

29/03/2011

Dirceu Morais

...eu preciso que retorne varias linhas...



Tente assim:

CREATE OR ALTER PROCEDURE CONSULTA(PNOME DM_NOME) 
RETURNS (NOME VARCHAR(50))
 AS declare variable xnome varchar(50);
BEGIN
   For SELECT NOMEUSUARIO FROM USUARIO         WHERE NOMEUSUARIO LIKE '%'|| :PNOME ||'%'    INTO :xNOME;
     Do begin           nome = Xnome;
      SUSPEND;
      end
END 


ps:
Para dar Certo, este DM_NOME tem que ser VARCHAR

Responder

Gostei + 0

29/03/2011

Nilo Souza

Executei a procedure abaixo e deu certo no ibexpert.
Porem retornou somente uma linha veja a mensagem:

------ Resultados de execução do Procedimento: ------

VARLISTA = Nilo souza

Na verdade tem 3 nomes que começam com a letra N quando é chamada a procedure: EXECUTE PROCEDURE consulta('N')

E assim mesmo ou temos que fazer algo?


CREATE OR ALTER PROCEDURE CONSULTA(PNOME DM_NOME)
RETURNS (varLISTA VARCHAR(50))
 AS
declare variable varNome varchar(50);
BEGIN
   For SELECT NOMEUSUARIO FROM USUARIO
       WHERE NOMEUSUARIO LIKE '%'|| :PNOME ||'%' INTO :varNome
     Do begin
          varLISTA = varNome;
      SUSPEND;
      end
END
Responder

Gostei + 0

30/03/2011

Emerson Nascimento

atente-se para o fato de o Firebird fazer diferenciação entre letras maiúsculas e minúsculas. para evitar esse problema, utilize a função UPPER().


CREATE OR ALTER PROCEDURE CONSULTA(PNOME DM_NOME)
RETURNS (varNome VARCHAR(50))
AS
BEGIN
   For SELECT NOMEUSUARIO FROM USUARIO
       WHERE UPPER(NOMEUSUARIO) LIKE '%'|| UPPER(:PNOME) ||'%' INTO :varNome
   Do SUSPEND;
END

da forma como está a SP trará todos os nomes que CONTENHAM o valor informado (não somente as que iniciam pelo valor informado).
Responder

Gostei + 0

30/03/2011

Nilo Souza

Caro colega,
entendi sua explicação e farei os ajustes. É que deixo jeito no console do ibexpert apareceu apenas uma linha ao invés de aparecer as outras.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar