从对象表

时间:2015-10-01 00:32:43

标签: oracle plsql refs

我想运行一个函数,它将从对象表中选择一个ref属性,如果该表返回null,则该属性设置为null。为此,我尝试了代码。

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

但是,无论何时找不到匹配,这都会失败。到位我有以下

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;

但我想如果有一个更好的解决方案没有涉及如此多的冗余。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

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

import java.util.Scanner;

public static void main(String[] args){
  Scanner input = new Scanner(System.in);

  int i = 0;
  int n = 0;

  //It's use to verify the inputs (i and n).
  do{

    System.out.print("Enter i :");
    i = input.nextInt();

    System.out.print("\nEnter n :");
    n = input.nextInt();

    if(i >= 1 || n <= 1){
      System.out.println("Please enter numbers above 1 \n");
    }    

  }while(i <= 1 || n <= 1);

  System.out.print(n + " multiples of " + i + " are: ");

  for (int counter = 0 ; counter < n ; counter++) {
    System.out.print(i*(2 + counter) + " ");
  }

}

这避免了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_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; 将是最常见的,并且最准确地表达您的意图。