2015-04-22 10 views
5

È possibile restituire null da una funzione di oracle?Tipo di ritorno disattivabile nella funzione Oracle

Ho la seguente funzione di oracolo:

create or replace function vta.GetAmount(p_month NUMBER) 
    return number is 
    v_amount number(9); 
begin 
    select amount 
    into v_amount 
    from salary 
    where salary.month = p_month; 
    return v_amount; 
end GetAmount; 

Quando l'istruzione SELECT restituisce zero righe, si solleva la seguente eccezione: ora-01403: no data found.

In questo caso, mi piacerebbe che la funzione restituisca null.

+0

Il vostro select sta tornando più di 1 riga per cui il codice viene meno, non perché sta tornando 0 righe. Se avesse restituito 0 righe, avresti ottenuto null come ritorno. – anudeepks

+0

No, se avesse restituito 0 righe, otterresti l'eccezione no_data_found. – Boneist

+0

provare a eseguire solo questo, selezionare importo dal salario dove salary.month = : e vedere i risultati; – anudeepks

risposta

4
create or replace function vta.GetAmount(p_month NUMBER) 
    return number is 
    v_amount number(9); 
begin 
    select amount 
    into v_amount 
    from salary 
    where salary.month = p_month; 
    return v_amount; 
    exception -- code to handle no data 
    when no_data_found then 
    return null; 
    end GetAmount; 
0

Se si sa/vuole tornare sempre una riga davvero, si potrebbe cambiare la tua selezione per select nvl(sum(amount),0)

  1. sum fa in modo da ottenere sempre 1 fila, perché non stai raggruppamento
  2. nvl sostituisce null con 0 se non viene trovato

essere consapevoli del fatto che si otterrà una somma di tutte le righe corrispondenti se ce ne sono più di una, ovviamente.

3

Quando si esegue un cursore implicito non cumulativo in PL/SQL (che è ciò che si è fatto con il proprio SELECT ... INTO ...), è necessario ricordare che prevede almeno 1 riga e al massimo una riga.

Se si ottiene meno di o più di 1 riga, si otterrà un'eccezione - NO_DATA_FOUND o TOO_MANY_ROWS, che sono entrambi abbastanza auto-esplicativi.

Se si desidera che il codice esegua qualcosa se si verifica un'eccezione, sarà necessario gestire tali eccezioni.

Esempio:

create or replace function vta.GetAmount(p_month NUMBER) 
    return number is 
    v_amount number(9); 
begin 
    select amount 
    into v_amount 
    from salary 
    where salary.month = p_month; 
    return v_amount; 
exception 
    when no_data_found then 
    return null; 
    when too_many_rows then 
    return null; 
end GetAmount;