Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Problemas ao executar a função categoria_cliente

Ao tentar executar a função categoria_cliente o sqldeveloper me retorna o seguinte erro:

Erro a partir da linha : 51 no comando -
BEGIN :g_CATEGORIA := categoria_cliente(110000); END;
Relatório de erros -
ORA-06503: PL/SQL: Função retornada sem valor
ORA-06512: em "CURSOPLSQL.CATEGORIA_CLIENTE", line 16
ORA-06512: em line 1
06503. 00000 -  "PL/SQL: Function returned without value"
*Cause:    A call to PL/SQL function completed, but no RETURN statement was
           executed.
*Action:   Rewrite PL/SQL function, making sure that it always returns
           a value of a proper type.

O erro acontece ao tentar executar o comando:

EXECUTE :g_CATEGORIA := categoria_cliente(110000);

Segue meu código:

CREATE OR REPLACE FUNCTION categoria_cliente
    (p_FATURAMENTO_PREVISTO IN CLIENTE.FATURAMENTO_PREVISTO%TYPE)
    RETURN CLIENTE.CATEGORIA%TYPE
 IS
    v_CATEGORIA CLIENTE.CATEGORIA%TYPE;
 BEGIN
     IF p_FATURAMENTO_PREVISTO < 10000 THEN
        v_CATEGORIA := 'PEQUENO';
    ELSIF p_FATURAMENTO_PREVISTO < 50000 THEN
        v_CATEGORIA := 'MÉDIO';
    ELSIF p_FATURAMENTO_PREVISTO < 100000 THEN
        v_CATEGORIA := 'MÉDIO';
    ELSE
        v_CATEGORIA := 'GRANDE';
    END IF;
 END;

VARIABLE g_CATEGORIA VARCHAR2(100);
EXECUTE :g_CATEGORIA := categoria_cliente(110000);
PRINT g_CATEGORIA;
1 resposta
solução!

Acabei me esquecendo de adicionar o return v_CATEGORIA, então a função estava dando erro por não retornar nenhum valor. Segue o código corrigido:

create or replace NONEDITIONABLE FUNCTION categoria_cliente
    (p_FATURAMENTO_PREVISTO IN CLIENTE.FATURAMENTO_PREVISTO%TYPE)
    RETURN CLIENTE.CATEGORIA%TYPE
 IS
    v_CATEGORIA CLIENTE.CATEGORIA%TYPE;
 BEGIN
     IF p_FATURAMENTO_PREVISTO < 10000 THEN
        v_CATEGORIA := 'PEQUENO';
    ELSIF p_FATURAMENTO_PREVISTO < 50000 THEN
        v_CATEGORIA := 'MÉDIO';
    ELSIF p_FATURAMENTO_PREVISTO < 100000 THEN
        v_CATEGORIA := 'MÉDIO';
    ELSE
        v_CATEGORIA := 'GRANDE';
    END IF;
    RETURN v_CATEGORIA;

 END;