Select 并允许来自对象的 Ref(null) 结果 Table

Select And Allow Ref(null) Result From Object Table

我想要 运行 一个函数,它将 select 从对象 table 到属性的引用,如果 table returns 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;

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

有什么建议吗?

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

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(*) returns 与后续 select 不同的结果的潜在竞争条件。从技术上讲,假设您之前从未为 self_ref 赋值,那么它已经是 null,因此您的异常处理程序可以简单地忽略 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 是最常见的,并且可以最准确地表达您的意图。