J'ai une fonction qui retournerait un enregistrement de type my_table%ROWTYPE
, et dans l'appelant, je pourrais vérifier si l'enregistrement retourné est nul, mais PL/SQL se plaint de l'instruction if qui
PLS-00306: nombre ou types d'arguments incorrects dans l'appel à 'IS NOT NULL'
Voici mon code:
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;
Merci.
Pour autant que je sache, ce n'est pas possible. Vérification du PRIMARY KEY
ou un NOT NULL
la colonne devrait cependant suffire.
Vous pouvez vérifier v_record.row_id IS NULL
.
Votre fonction lancerait un NO_DATA_FOUND
exception cependant, quand aucun enregistrement n'est trouvé.
Vous ne pouvez pas tester la non-existence de cette variable, il y a donc deux façons de procéder. Vérifiez l'existence d'un seul élément. Je n'aime pas cela car cela signifie que si quelque chose change, votre code ne fonctionne plus. Au lieu de cela, pourquoi ne pas simplement lever une exception lorsqu'il n'y a pas de données:
Je me rends compte que le others
dans l'exception est très méchant, mais il ne verra vraiment ma table disparaître que lorsqu'elle ne devrait pas et rien d'autre.
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;