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.*/
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;
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..
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;
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
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;
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.
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;
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;
/
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.
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;