procedure não retorna resultado apos if

Delphi

05/04/2005

tenho essa procedure

CREATE PROCEDURE VALIDA_USUARIO (
PAR_NOME_USUARIO VARCHAR(10),
PAR_SENHA_USUARIO VARCHAR(10))
RETURNS (
R_CODIGO INTEGER,
R_NOME VARCHAR(10),
R_SENHA VARCHAR(10),
R_ATIVO VARCHAR(1),
R_DATA_EXP DATE,
R_VALIDO VARCHAR(1))
AS
begin
FOR SELECT USUARIOS.codigo,
usuarios.nome,
usuarios.senha,
USUARIOS.ativo,
USUARIOS.data_expiracao

FROM usuarios

WHERE USUARIOS.NOME = :par_nome_usuario AND USUARIOS.senha = :par_senha_usuario

INTO :R_CODIGO,
:R_NOME,
:R_SENHA,
:R_ATIVO,
:R_DATA_EXP

DO
suspend;

BEGIN
IF (:R_NOME is null) then
BEGIN
EXCEPTION USUARIO_SENHA_INVALIDO;
END
ELSE
BEGIN
IF (:R_ATIVO <> ´S´) THEN
BEGIN
EXCEPTION USUARIO_DESATIVADO;
END
ELSE
BEGIN
IF (:R_DATA_EXP is null) then
begin
r_valido = ´S´;
end
else
begin
if (:R_DATA_EXP < CURRENT_TIMESTAMP) then
BEGIN
EXCEPTION usuario_expirado;
END
else
begin
r_valido = ´S´;
end
end
END
END
END
end

todos os if onde uso o EXCEPTION retorna a EXCEPTION mas onde tem r_valido = ´S´ não é incluido o resultado ficando o campo como null

o que pode estar a contecendo???

Valeu
Uilian Gurjon


Uiliangurjon

Uiliangurjon

Curtidas 0

Respostas

Kotho

Kotho

05/04/2005

O problema é que o suspend está antes da atribuição... tente colocar o suspend logo abaixo da atribuição, e todo o bloco de BEGIN mais externo depois do DO.


GOSTEI 0
Uiliangurjon

Uiliangurjon

05/04/2005

tentei colocar o suspend em outras linha para testar mas o

IF (:R_NOME is null) then
BEGIN
EXCEPTION USUARIO_SENHA_INVALIDO;
END

não retorna a exception

todos os outros retornam


GOSTEI 0
Kotho

Kotho

05/04/2005

se eu não me engano, você deve ter um único suspend para cada linha do FOR...SELECT...DO.

Olhando melhor sua procedure, acho melhor colocar o Suspend antes do último END


GOSTEI 0
Uiliangurjon

Uiliangurjon

05/04/2005

coloquei o suspend antes do ultimo end e o primeiro if continua não retornando a exeption


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

05/04/2005

tente assim:

CREATE PROCEDURE VALIDA_USUARIO (
  PAR_NOME_USUARIO VARCHAR(10),
  PAR_SENHA_USUARIO VARCHAR(10))
RETURNS (
  R_CODIGO INTEGER,
  R_NOME VARCHAR(10),
  R_SENHA VARCHAR(10),
  R_ATIVO VARCHAR(1),
  R_DATA_EXP DATE,
  R_VALIDO VARCHAR(1))
AS
BEGIN
  FOR SELECT usuarios.codigo,
             usuarios.nome,
             usuarios.senha,
             usuarios.ativo,
             usuarios.data_expiracao
      FROM usuarios
      WHERE usuarios.NOME = :par_nome_usuario AND usuarios.senha = :par_senha_usuario
  INTO :R_CODIGO,
       :R_NOME,
       :R_SENHA,
       :R_ATIVO,
       :R_DATA_EXP
  DO
  BEGIN
    IF (:R_NOME is null) THEN
      EXCEPTION USUARIO_SENHA_INVALIDO
    ELSE
    IF (:R_ATIVO <> ´S´) THEN
      EXCEPTION USUARIO_DESATIVADO
    ELSE
    IF (:R_DATA_EXP is null) or (:R_DATA_EXP >= CURRENT_TIMESTAMP) THEN
      r_valido = ´S´
    ELSE
    IF (:R_DATA_EXP < CURRENT_TIMESTAMP) then 
      EXCEPTION usuario_expirado;

    SUSPEND;
  END 
END



GOSTEI 0
POSTAR