Abstract:

Function-based index 可以很巧妙地帮助我们实现“不一般”的unique index, 但是如果没有注意function-based index对于该index对应的function的要求,很有可能会触发ORA-01802这个错误。 本文尝试去阐述这个错误是如何触发的,以及如果去解决。

 

OK, let’s get down to business.

 

记得Tom大叔的力作《Oracle编程艺术》中提到function-based index 可以用来解决下面的问题。 比如说现在有个表Test, 其Schema 如下,

SQL> desc test;
Name                                      Null?    Type
----------------------------------------- -------- -----------------
ID                                                     NUMBER
NAME                                               VARCHAR2(20)

 

现在假设有这个需求,要求这个表只能存在一条Name为Frank的记录,对于其他的Name值则没有这个限制, 比如说Name列可以包含多个Fraud, Michael 等。这个该怎么解决呢? 很显然,简单地在列Name上加上一个Unique索引是解决不了问题的,因为我们只是需要保证表中只包含一条Name是Frank的记录。提到Unique Index,我们很容易会想到它与Primary Key的区别就是它允许index entry为Null, 而且可以存在多条为Null的记录,因为Null 跟 Null 是不相等的(但是要注意,如果Unique Key包含两列以上,情况则不一样了!),因此可以认为是满足Unique Key的要求的。 那么如何来实现这个想法呢, 这时候我们要求助于function了,

 

create or replace function fnTestReplace(v_name in varchar2) return varchar2
as
begin
 return
 (
     case v_name
         when 'Frank' then v_name
         else NULL
     end
  );
end;
/

相关文章:

  • 2021-07-26
  • 2022-12-23
  • 2022-12-23
  • 2021-10-28
  • 2022-12-23
  • 2021-06-07
  • 2022-12-23
  • 2021-07-16
猜你喜欢
  • 2021-12-09
  • 2021-06-09
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-16
  • 2022-12-23
相关资源
相似解决方案