Проверьте запись IS NOT NULL в plsql

У меня есть функция, которая вернет запись с типом my_table%ROWTYPE, а в вызывающем я могу проверить, является ли возвращенная запись нулевой, но PL/SQL жалуется на if-statement, который

PLS-00306: неправильное число или типы аргументов при вызове 'IS NOT NULL'

Вот мой код:

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;

Спасибо.

Ответ 1

Насколько я знаю, это невозможно. Однако проверка столбца PRIMARY KEY или NOT NULL должна быть достаточной.


Вы можете проверить v_record.row_id IS NULL.

Ваша функция будет генерировать исключение NO_DATA_FOUND, хотя, если запись не найдена.

Ответ 2

Вы не можете проверить отсутствие этой переменной, поэтому есть два пути. Проверьте наличие одного элемента. Мне это не нравится, поскольку это означает, что если что-то изменит ваш код, он больше не работает. Вместо этого почему бы не просто создать исключение, если там нет данных:

Я понимаю, что others в исключении очень непослушный, но он действительно поймает мою таблицу, исчезая, когда она не должна, и ничего больше.

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;