ITPub博客

首页 > 数据库 > PostgreSQL > PostgreSQL DBA(165) - pgAdmin(Create Function选项)

PostgreSQL DBA(165) - pgAdmin(Create Function选项)

原创 PostgreSQL 作者:husthxd 时间:2020-02-25 17:47:19 0 删除 编辑

本节简单介绍了PostgreSQL创建函数中的选项。

Create Function的语法如下:

[pg12@localhost ~]$ psql
Expanded display is used automatically.
psql (12.2)
Type "help" for help.
[local:/data/run/pg12]:5120 pg12@testdb=# \help create function
Command:     CREATE FUNCTION
Description: define a new function
Syntax:
CREATE [ OR REPLACE ] FUNCTION
    name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] )
    [ RETURNS rettype
      | RETURNS TABLE ( column_name column_type [, ...] ) ]
  { LANGUAGE lang_name
    | TRANSFORM { FOR TYPE type_name } [, ... ]
    | WINDOW
    | IMMUTABLE | STABLE | VOLATILE | [ NOT ] LEAKPROOF
    | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
    | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
    | PARALLEL { UNSAFE | RESTRICTED | SAFE }
    | COST execution_cost
    | ROWS result_rows
    | SUPPORT support_function
    | SET configuration_parameter { TO value | = value | FROM CURRENT }
    | AS 'definition'
    | AS 'obj_file', 'link_symbol'
  } ...
URL: https://www.postgresql.org/docs/12/sql-createfunction.html
[local:/data/run/pg12]:5120 pg12@testdb=#

LANGUAGE
包括sql,c,internal,plpgsql等等

TRANSFORM
该选项列出调用函数时应使用的transform.
transform说明了如何转换数据类型到一种编程语言.比如使用hstore类型通过PL/Python语言来编写函数,
PL/Python无法在Python语言环境中标识hstore类型的数据.语言默认使用文本,但如果出现数组或者链表,
这种默认处理就不合适了.
transform指定了两种函数:
“from SQL”:从SQL环境到编程语言.该函数在使用该语言编写的函数时对参数进行处理.
“to SQL”:从编程语言到SQL环境.处理返回值时调用.
该选项用于PL/Java等编程语言中.

WINDOW
使用该选项,标明该函数是窗口函数(window function)而不是普通函数.

IMMUTABLE | STABLE | VOLATILE
这三个会影响查询优化器.默认选项是VOLATILE.
IMMUTABLE:表示函数不能更改数据库并且给定什么参数就返回什么值,100%的确定性.
STABLE:表示函数不能更改数据库,在一次表扫描过程中,对于同样的参数会返回相同的结果,但结果可以在SQL语句之间改变.
结果如果依赖于数据库查找,参数变量可变时可使用该选项.
VOLATILE:在一次表扫描时,结果也可以改变.如random(),currval()函数等.

LEAKPROOF
该选项表示函数不存在副作用.除了返回值,不会reveals参数的相关信息,比如如果因为某些参数值抛出错误信息,
或者在错误信息中包含参数值,那么该函数被不是leafproof.
该选项会影响以security_barrier选项创建的view或者启用row level security的数据表.
系统将在用户提供的包含non-leakproof函数的条件之前执行来自安全策略的条件和来自查询本身的安全屏障视图,以防止数据的意外泄漏.
标记为leakproof的函数和操作符被认为是可信的,可以在安全策略和安全屏障视图的条件之前执行。

CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
默认选项为CALLED ON NULL INPUT,表示如某些参数为null函数可以正常调用.函数的编写者有责任检查null值.
RETURNS NULL ON NULL INPUT | STRICT表示如果出现参数为null,则返回null.

SECURITY INVOKER | SECURITY DEFINER
SECURITY INVOKER表示以调用者的权限执行函数,这是默认选项.SECURITY DEFINER则表示以owner的权限执行函数.

PARALLEL UNSAFE | RESTRICTED | SAFE
PARALLEL UNSAFE表示不能以并行模式执行函数,如在SQL中出现该函数则需串行执行,这是默认选项.
PARALLEL RESTRICTED表示函数可以并行模式执行,但执行者限制为并行组的leader.
PARALLEL SAFE表示无约束的并行执行.
如函数修改了数据库状态或者使用子事务修改了事务状态或者尝试访问序列或者改变设置(如setval),那么函数应标记为unsafe.
如函数访问临时表,客户端连接状态,游标,预准备语句或者系统无法以并行模式同步的后端本地状态,那么应标记为restricted.
如函数实际上unsafe但标记为safe,那么会产生不可预知的错位.

COST
函数执行的估算成本,单位为cpu_operator_cost.

ROWS
函数返回的估算行数.

SUPPORT
该函数使用的planner support function.

SET
进入该函数时,设置配置参数为指定的值,执行完毕则恢复为原来的参数值.

AS
函数定义.

参考资料
CREATE FUNCTION

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/6906/viewspace-2677172/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
ITPUB数据库版块资深版主,对Oracle、PostgreSQL有深入研究。

注册时间:2007-12-28

  • 博文量
    1492
  • 访问量
    3930231