0

我想运行一个函数,该函数将从对象表中选择一个引用到一个属性中,如果表返回 null,则该属性设置为 null。为了实现这一点,我尝试了代码。

select ref(t) into self_ref from my_table where objectID = self.objectID;

但这在 where 找不到匹配项的任何时候都会失败。我有以下内容

select count(*)
    into l_result
    from my_table
 where companyID = self.companyID;
if l_result > 0 then
    select ref(t)
        into self_ref
        from my_table t
     where objectID = self.objectID;
else
    self_ref := null;
end if;

但我希望有一个更好的解决方案,不涉及太多冗余。

有什么建议么?

4

1 回答 1

1

常规方法(无论您是处理对象引用还是任何其他局部变量)将是

begin
  select ref(t)
    into self_ref
    from my_table t
   where objectID = self.objectID;
exception
  when no_data_found
  then
    self_ref := null;
end;

这避免了潜在的竞争条件,即count(*)返回与后续结果不同的结果select。从技术上讲,假设您以前从未分配过值self_refnull那么您的异常处理程序就可以简单地忽略no_data_found异常。我更喜欢对变量进行显式分配,null即使它在技术上是多余的,但是,因为它倾向于使代码更清晰。null如果您明确地进行,后续维护者不必质疑您是否打算设置(或离开)局部变量。

您也可以通过其他各种方式构建它,例如

self_ref := null;
for r in (select ref(t) my_ref
            from my_table t
           where objectID = self.objectID)
loop
  self_ref := r.my_ref;
end loop;

但是select into带有异常处理程序的将是最常见的,并且会最准确地表达您的意图。

于 2015-10-01T00:41:39.610 回答