2011-08-26 15 views
14

Ho una funzione che restituirebbe un record con tipo my_table%ROWTYPE e nel chiamante potrei controllare se il record restituito è nullo, ma PL/SQL si lamenta dell'istruzione if cheControllare un record IS NOT NULL in plsql

PLS-00306: numero o il tipo di argomenti nella chiamata a male 'non è nullo'

Ecco il mio codice:

v_record my_table%ROWTYPE; 
v_row_id my_table.row_id%TYPE := 123456; 
begin 
    v_record := myfunction(v_row_id) 
    if (v_record is not null) then 
     -- do something 
    end if; 
end; 

function myfunction(p_row_id in my_table.row_id%TYPE) return my_table%ROWTYPE is 
    v_record_out my_table%ROWTYPE := null; 
begin 
    select * into v_record_out from my_table 
    where row_id = p_row_id; 
    return v_record_out; 
end myfunction; 

Grazie.

risposta

22

Per quanto ne so, non è possibile. Tuttavia, il controllo della colonna PRIMARY KEY o di una colonna NOT NULL dovrebbe essere sufficiente.


È possibile verificare per v_record.row_id IS NULL.

La tua funzione genererebbe comunque un'eccezione NO_DATA_FOUND, quando non viene trovato alcun record.

+1

Grazie per la risposta. È l'unico modo per controllare se un record è nullo? È strano per me che possiamo assegnare null a un record, ma non possiamo controllare se un record è nullo. – Sapience

+2

Per quanto ne so, non è possibile. Tuttavia, il controllo della chiave PRIMARY KEY o 'NOT NULL' dovrebbe essere sufficiente. –

+1

Buona soluzione! Io uso l'assegnazione di 'NULL' per registrare e questo è il modo di controllare! +1 – gavenkoa

3

Non è possibile verificare la non esistenza di questa variabile in modo che ci siano due modi per farlo. Verifica l'esistenza di un singolo elemento. Non mi piace perché significa che se qualcosa cambia il tuo codice non funziona più. Invece perché non sollevare un'eccezione quando non ci sono dati lì:

Mi rendo conto che lo others nell'eccezione è molto cattivo, ma riuscirà davvero a far scomparire il mio tavolo quando non dovrebbe e nient'altro.

v_record my_table%ROWTYPE; 
v_row_id my_table.row_id%TYPE := 123456; 

begin 
    v_record := myfunction(v_row_id) 
exception when others then 
     -- do something 
end; 

function myfunction(p_row_id in my_table.row_id%TYPE) return my_table%ROWTYPE is 
    v_record_out my_table%ROWTYPE := null; 

cursor c_record_out(c_row_id char) is 
select * 
    from my_table 
    where row_id = p_row_id; 

begin 
    open c_record_out(p_row_id); 
    fetch c_record_out into v_record_out; 

    if c_record_out%NOTFOUND then 
     raise_application_error(-20001,'no data); 
    end if; 
    close c_record_out; 
return v_record_out; 
end myfunction;