web-dev-qa-db-fra.com

Vérifier un enregistrement IS NOT NULL in plsql

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.

21
Sapience

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é.

31
Peter Lang

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;
3
Ben