2011-08-26 16 views
14

Tengo una función que devolvería un registro con tipo my_table%ROWTYPE, y en la persona que llama, podría verificar si el registro devuelto es nulo, pero PL/SQL se queja del enunciado if queCompruebe un registro IS NOT NULL en plsql

PLS-00306: número equivocado o tipos de argumentos en call 'no es nulo'

Aquí está mi código:

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; 

Gracias.

Respuesta

22

Por lo que sé, no es posible. Sin embargo, verificar la columna PRIMARY KEY o NOT NULL debería ser suficiente.


Puede verificar v_record.row_id IS NULL.

Sin embargo, su función emitiría una excepción NO_DATA_FOUND, cuando no se encuentra ningún registro.

+1

Gracias por su respuesta. ¿Es esa la única forma de verificar si un registro es nulo? Es extraño para mí que podamos asignar nulo a un registro, pero no podemos verificar si un registro es nulo. – Sapience

+2

Por lo que yo sé, no es posible. Sin embargo, verificar la columna 'PRIMARY KEY' o' NOT NULL' debería ser suficiente. –

+1

¡Buena solución! ¡Uso la asignación de 'NULL' para grabar y esta es la manera de comprobarlo! +1 – gavenkoa

3

No se puede probar la inexistencia de esta variable, por lo que hay dos formas de hacerlo. Verifique la existencia de un solo elemento. No me gusta esto, ya que si algo cambia tu código ya no funciona. En su lugar, ¿por qué no solo generar una excepción cuando no hay datos allí?

Me doy cuenta de que el others en la excepción es muy travieso, pero solo conseguirá que mi tabla desaparezca cuando no debería y nada más.

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; 
Cuestiones relacionadas