Criação de Function select into

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
julianaf024
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 22
Registrado em: Sex, 30 Out 2009 10:24 am
Localização: sp
Juliana Fernandes

Desculpem, mas sou bem basica mesmo e estoou resovendo alguns exercicios da faculdade com muita dificildade. Vou postar um e por favor me falem onde estou errando.

/*2) Faça uma função chamada fun_consulta_nf_RMnnnnn, para consultar notas
fiscais usando como parâmetro o numero da nota fiscal. Use para fazer a consulta
SELECT INTO, e use os exceptions necessarios.*/

Selecionar tudo

CREATE OR REPLACE FUNCTION FUN_CONSULTA_NF_RM63016
(P_NR_NOTA IN LOC_NF_LOCACAO.NR_NOTA%TYPE) RETURN 
VARCHAR2 AS

  BEGIN
      SELECT * 
      INTO V_NOTA
      FROM LOC_NF_LOCACAO 
      WHERE NR_NOTA = P_NR_NOTA;   
      
      RETURN V_NOTA;
  END;
  
  EXCEPTION
      WHEN NO_DATA_FOUND
      THEN RETURN 'NENHUMA NOTA FISCAL';
      WHEN OTHERS
      THEN RAISE_APPLICATION_ERROR(-20011,'ERRO DESCONHECIDO');
  END;
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

qual o erro?

acho q você não esta declarando a variavel V_NOTA.. lembre q o tipo dela tem q ser igual o da tabela

Selecionar tudo

declare
   V_NOTA LOC_NF_LOCACAO.VR_NOTA%TYPE;
e outra coisa

quando você usa o * e into.. você teria q ter uma variavel do tipo linha da tabela em questao e sua variavel, que não foi declarada, devera receber o que você especificar no select, no caso você tem q ajusatar para trazer so o campo que deseja alimentar a variavel..

Selecionar tudo

select VR_NOTA into V_NOTA
substituia VR_NOTA pelo campo da sua tabela q tem o valor da nota

Selecionar tudo

CREATE OR REPLACE FUNCTION FUN_CONSULTA_NF_RM63016
(P_NR_NOTA IN LOC_NF_LOCACAO.NR_NOTA%TYPE) RETURN
VARCHAR2 AS

declare
   V_NOTA LOC_NF_LOCACAO.VR_NOTA%TYPE;

BEGIN
SELECT VR_NOTA
INTO V_NOTA
FROM LOC_NF_LOCACAO
WHERE NR_NOTA = P_NR_NOTA;

RETURN V_NOTA;
END;

EXCEPTION
WHEN NO_DATA_FOUND
THEN RETURN 'NENHUMA NOTA FISCAL';
WHEN OTHERS
THEN RAISE_APPLICATION_ERROR(-20011,'ERRO DESCONHECIDO');
END;
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Eu daria o raise da exception anterior no when others, pois o erro não é desconhecido, ele é conhecido e você pode ver qual erro aconteceu usando SQLERRM e SQLCODE. Além disso, você não vai conseguir dar o (return 'NENHUMA NOTA FISCAL') porque o seu return type deveria ser substituído por

Selecionar tudo

LOC_NF_LOCACAO.VR_NOTA%TYPE
e não varchar2, como está.

Selecionar tudo

CREATE OR REPLACE FUNCTION FUN_CONSULTA_NF_RM63016
(P_NR_NOTA IN LOC_NF_LOCACAO.NR_NOTA%TYPE) RETURN
LOC_NF_LOCACAO.VR_NOTA%TYPE AS 

...
...

EXCEPTION
WHEN NO_DATA_FOUND THEN 
  RETURN null;
WHEN OTHERS THEN
  -- trataria se precisasse, por exemplo, fechar cursores
  RAISE_APPLICATION_ERROR(-20011,'ERRO FUN_CONSULTA_NF_RM63016: ' || SQLERRM);
END; 
julianaf024
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 22
Registrado em: Sex, 30 Out 2009 10:24 am
Localização: sp
Juliana Fernandes

Vitor, já havia tentado desse jeito.
Mesmo modificando conforme as 2 indicações dadas, a função continua compilando com advertencia.
Mesmo testando sem o exception compila com advertencia.

Veja como ficou

Selecionar tudo

CREATE OR REPLACE FUNCTION FUN_CONSULTA_NF_RM63016 
(P_NR_NOTA IN LOC_NF_LOCACAO.NR_NOTA%TYPE) RETURN 
LOC_NF_LOCACAO.VR_NOTA%TYPE AS 

declare 
   V_NOTA LOC_NF_LOCACAO.NR_NOTA%TYPE; 

BEGIN 
SELECT NR_NOTA 
INTO V_NOTA 
FROM LOC_NF_LOCACAO 
WHERE NR_NOTA = P_NR_NOTA; 

RETURN V_NOTA; 
END; 

EXCEPTION 
WHEN NO_DATA_FOUND THEN 
  RETURN null; 
WHEN OTHERS THEN 
  RAISE_APPLICATION_ERROR(-20011,'ERRO FUN_CONSULTA_NF_RM63016: ' || SQLERRM); 
END; 
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Qual advertência está dando?
julianaf024
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 22
Registrado em: Sex, 30 Out 2009 10:24 am
Localização: sp
Juliana Fernandes

Eu to usando o SQL DEVELOPER.
Somente a mensagem abaixo:

Selecionar tudo

Warning: execução concluída com advertência
FUNCTION FUN_CONSULTA_NF_RM63016 Compilado.
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

warning não é erro

o seu programa foi compilado.. iso e que interessa

8)
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

vê se funciona ai

Selecionar tudo

CREATE OR REPLACE FUNCTION FUN_CONSULTA_NF_RM63016 (P_NR_NOTA IN LOC_NF_LOCACAO.NR_NOTA%TYPE)
    RETURN NUMBER AS
  
  DELCARE
    V_NOTA NUMBER;
  
  BEGIN
    SELECT NR_NOTA
    INTO V_NOTA
    FROM LOC_NF_LOCACAO
    WHERE NR_NOTA = P_NR_NOTA;
    
    RETURN V_NOTA;
    
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
      RETURN null;
    WHEN OTHERS THEN
      RAISE_APPLICATION_ERROR(-20011,'ERRO FUN_CONSULTA_NF_RM63016: ' || SQLERRM);
    
END FUN_CONSULTA_NF_RM63016;
/
julianaf024
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 22
Registrado em: Sex, 30 Out 2009 10:24 am
Localização: sp
Juliana Fernandes

Debugando da esse erro:

Selecionar tudo

Error(6,1): PLS-00103: Encountered the symbol "DECLARE" when expecting one of the following:     begin function package pragma procedure subtype type use    <an identifier> <a double-quoted delimited-identifier> form    current cursor external language The symbol "begin" was substituted for "DECLARE" to continue.
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

tira o declare

Selecionar tudo

CREATE OR REPLACE FUNCTION FUN_CONSULTA_NF_RM63016 (P_NR_NOTA IN LOC_NF_LOCACAO.NR_NOTA%TYPE)
    RETURN NUMBER AS
         V_NOTA NUMBER;
 
  BEGIN
    SELECT NR_NOTA
    INTO V_NOTA
    FROM LOC_NF_LOCACAO
    WHERE NR_NOTA = P_NR_NOTA;
   
    RETURN V_NOTA;
   
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
      RETURN null;
    WHEN OTHERS THEN
      RAISE_APPLICATION_ERROR(-20011,'ERRO FUN_CONSULTA_NF_RM63016: ' || SQLERRM);
   
END FUN_CONSULTA_NF_RM63016;

julianaf024
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 22
Registrado em: Sex, 30 Out 2009 10:24 am
Localização: sp
Juliana Fernandes

Agora foi sem erro....
Muito obrigada Vitor!!!!
Responder
  • Informação