是否可以使用可以抛出异常的STABLE函数?

时间:2016-01-11 23:23:37

标签: postgresql plpgsql

如果不熟悉Postgres,我会谨慎地定义一个函数,以便规划器/优化器可能会跳过它,否则会引发异常。函数的波动率(STABLEVOLATILEIMMUTABLE)是否会在引发异常时被更改,还是以与返回值相同的方式缓存?

是否有关于如何定义函数-com-throw的既定约定?

根据docs

  
      
  • VOLATILE函数可以执行任何操作,包括修改数据库。它可以使用相同的参数在连续调用时返回不同的结果。优化器不对这些函数的行为做出假设。 [...]

  •   
  • STABLE函数无法修改数据库,并且保证在单个语句中为所有行提供相同参数的情况下返回相同的结果。此类别允许优化器将函数的多个调用优化为单个调用。 [...]

  •   
  • IMMUTABLE函数无法修改数据库,并且保证在永远给定相同参数的情况下返回相同的结果。此类别允许优化器在查询使用常量参数调用函数时预先评估函数。 [...]

  •   

关于返回值的行为方式,这是非常明确的,但是未解决异常(在RETURN之前发生)。 ...我知道函数定义的其他部分(例如使用STRICT)可能会导致计划程序跳过可能的异常,但是这里呢?

是否存在潜在的边缘情况,其中STABLE函数被定义为具有较高的通话费用(其反过来使用其他STABLE和/或IMMUTABLE函数来帮助它)可能会被跳过什么时候通常会抛出?

另一种回答这个问题的方法是解释plpgsql编译器/解释器如何/不同地处理包含RAISE EXCEPTION的函数,注意例如波动率状态是否被函数体中出现的这些语句隐式改变

1 个答案:

答案 0 :(得分:2)

任何函数(VOLATILE,STABLE,IMMUTABLE)都可能引发异常。异常会停止执行并执行回滚。

目前没有缓存结果。在某些情况下,STABLE或IMMUTABLE函数的调用可以替换为计划时间的结果。如果函数索引,然后不调用该函数,则可以使用IMMUTABLE函数,并从索引中使用值。