PostgreSQL 函数的过程
CREATE [ OR REPLACE ] FUNCTION
name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] )
[ RETURNS rettype
| RETURNS TABLE ( column_name column_type [, ...] ) ]
{ LANGUAGE lang_name
| WINDOW
| IMMUTABLE | STABLE | VOLATILE
| CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
| [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
| COST execution_cost
| ROWS result_rows
| SET configuration_parameter { TO value | = value | FROM CURRENT }
| AS 'definition'
| AS 'obj_file', 'link_symbol'
} ...
[ WITH ( attribute [, ...] ) ]
函数稳定级别:IMMUTABLE STABLE VOLATILE
PostgreSQL中的函数在定义时有三种稳定性级别:
VOLATILE(不稳定)、STABLE(稳定)和IMMUTABLE(非常稳定)。
默认情况下,CREATE FUNCTION创建函数的稳定性为VOLATILE。稳定性级别使得优化器可以判断不同函数的行为。
MMUTABLE(非常稳定)
表示该函数不能修改数据库并且对于给定的参数值总是会返回相同的值。也就是说,它不会做数据库查找或者使用没有在其参数列表中直接出现的信息。如果给定合格选项,任何用全常量参数对该函数的额调用可以立刻用该函数值替换。
STABLE(稳定)
表示该函数不能修改数据库,并且对于相同的参数值,它在一次表扫描中将返回相同的结果。在大多数情况下是的。在单个表扫描中,对相同的参数值返回相同的结果,但结果将通过SQL语句进行更改。 结果取决于数据库查找或参数值。 current_timestamp 系列函数是 STABLE; 值在执行中不会改变。
VOLATILE(不稳定)
默认为VOLATILE。表示该函数的值在一次表扫描中都有可能改变,因此不能做优化。在这种意义上,相对较少的数据库函数是不稳定的。 例如: random(), currval(), timeofday()。 任何具有副作用的函数的都不稳定的,即使其结果是可预测的。例如: setval().
简单了解一下,推荐两个网址:看大神如何秀肌肉
Postgres —— IMMUTABLE | STABLE | VOLATILE 案例(1)
Postgres——IMMUTABLE | STABLE | VOLATILE (2)
推荐PostgreSQL中文文档:http://www.postgres.cn/docs/11/index.html