Stored produre não retorna valor
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!
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
Curtidas 0
Respostas
Eliel Martins
26/03/2011
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
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
GOSTEI 0
Nilo Souza
26/03/2011
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
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
GOSTEI 0
Dirceu Morais
26/03/2011
...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
GOSTEI 0
Nilo Souza
26/03/2011
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
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
GOSTEI 0
Emerson Nascimento
26/03/2011
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).
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).
GOSTEI 0
Nilo Souza
26/03/2011
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.
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.
GOSTEI 0