SYNOPSIS

CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] )
RETURNS rettype
{ LANGUAGE langname
| IMMUTABLE | STABLE | VOLATILE
| CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
| [EXTERNAL] SECURITY INVOKER | [EXTERNAL] SECURITY DEFINER
| AS 'definition'
| AS 'obj_file', 'link_symbol'
} ...
[ WITH ( attribute [, ...] ) ]

DESCRIPTION 描述

CREATE FUNCTION 定义一个新的函数。 CREATE OR REPLACE FUNCTION 将要么创建一个新函数, 要么替换现有的定义。

如果包含了一个模式名,那么函数就在指定的模式中创建。否则它会在当前模式中创建。 新函数的名字不能和同一个模式中的任何带有同样参数类型的函数同名。 不过,参数类型不同的函数可以同名(这叫做重载)。

要更新一个现有函数的定义,使用 CREATE OR REPLACE FUNCTION。 我们不能用这个方法修改一个函数的名字或者参数类型(如果你这么干,那么你就会创建一个新的,不同的函数)。 同样,CREATE OR REPLACE FUNCTION 也不会允许你修改一个现有函数的返回类型。 要做这些事情,你必须删除并重新创建函数。

如果你删除然后重建一个函数,新函数和旧的将是不同的实体;你会破坏现有规则,视图,触发器等等。 使用 CREATE OR REPLACE FUNCTION 可以在不破坏引用该函数的对象的前提下修改函数定义。

创建这个函数的用户成为函数的所有者。

PARAMETERS 参数

name
 要创建的函数名字。
argtype
 该函数的数据类型(可以有模式修饰)。如果有的话,参数类型可以是基本类型,也可以是复合类型,域类型,或者和一个现有字段相同的类型。

一个字段的类型是用 tablename.columnname%TYPE  表示的;使用这个东西可以帮助函数独立于表定义的修改。

根据实现语言的不同,我们还可以在这上面声明 "伪类型", 比如 cstring。伪类型表示实际的参数类型要么是没有完整地声明,要么是在普通的 SQL 数据类型之外。

rettype
 返回数据类型。输出类型可以声明为一个基本类型,复合类型,域类型, 或者从现有字段拷贝。参阅上面 argtype 的描述获取如何引用一个现有类型的信息。

根据实现语言的不同,我们还可以在这上面声明 "伪类型", 比如 cstring。 SETOF 修饰词表示该函数将返回一套条目, 而不是一条条目。

langname
 用以实现函数的语言的名字。 可以是 SQL,C, internal,或者是用户定义的过程语言名字。 (又见 createlang。 ) 为了保持向下兼容,该名字可以用单引号包围。

IMMUTABLE
STABLE
VOLATILE
 这些属性告诉系统把对该函数的多次调用替换成一次是否安全。 主要用于运行时优化。 至少应该声明一个选择。如果任何一个都没有出现,那么 VOLATILE 是缺省假设。

IMMUTABLE 表示该函数在给出同样的参数值时总是返回相同的结果; 也就是说,它不做数据库查找或者是使用那些并没有直接出现在其参数列表里面的信息。
如果给出这个选项,那么任何带着全部是常量参数对该函数的调用都将立即替换为该函数的值。

STABLE 表示在一次表扫描里,对相同参数值, 该函数将稳定返回相同的值,但是它的结果可能在不同 SQL 语句之间变化。
这个选项对那些结果倚赖数据库查找,参数变量(比如当前时区),等等的函数是很合适的。 还要注意 current_timestamp 族函数是 stable
(稳定)的,因为它们的值在一次事务中不会变化。

VOLATILE 表示该函数值甚至可以在一次表扫描内改变, 因此不会做任何优化。很少数据库函数在这个概念上是易变的; 一些例子是
random(),currval(), timeofday()。请注意任何有副作用的函数都必需列为易变类,
即使其结果相当有规律也应该这样,这样才能避免它被优化;一个例子就是 setval()。

CALLED ON NULL INPUT
RETURNS NULL ON NULL INPUT
STRICT
CALLED ON NULL INPUT (缺省)表明该函数在自己的某些参数是空值的时候还是可以按照正常的方式调用。
剩下的事情是函数的作者必须负责检查空值以及相应地做出反应。

RETURNS NULL ON NULL INPUT 或 STRICT 表明如果它的任何参数是 NULL,此函数总是返回 NULL。
如果声明了这个参数,则如果存在 NULL 参数时不会执行该函数; 而只是自动假设一个 NULL 结果。

[EXTERNAL] SECURITY INVOKER
[EXTERNAL] SECURITY DEFINER
SECURITY INVOKER 表明该函数将带着调用它的用户的权限执行。 这是缺省。SECURITY DEFINER
声明该函数将以创建它的用户的权限执行。

关键字 EXTERNAL 的目的是和 SQL 兼容, 但是我们和 SQL 不同的是,这个特性不仅仅适用于外部的函数, 所以它是可选的。

definition
 一个定义函数的字串;含义取决于语言。它可以是一个内部函数名字, 一个指向某个目标文件的路径,一个 SQL 查询,或者一个用过程语言写的文本。
obj_file, link_symbol
 这个形式的 AS 子句用于在函数的 C 源文件里的函数名字和 SQL 函数的名字不同的时候可动态装载 C 语言函数。 字串 obj_file 是包含可动态装载的对象的文件名,而 link_symbol 是函数的链接符号,也就是该函数在 C 源文件里的名字。 如果省略了链接符号,那么就假设它和被定义的 SQL 函数同名。

attribute
 历史遗留的函数可选信息。下面的属性可以在此出现:
isStrict
 等效于 STRICT 或者 RETURNS NULL ON NULL INPUT
isCachable
isCachable 是 IMMUTABLE 的过时的等效物;不过出于向下兼容,我们仍然接受它。

属性名是大小写无关的。

NOTES 注意

请参阅 ``User-Defined Functions'' 获取更多关于书写函数的信息。

我们允许你将完整的 SQL 类型语法用于输入参数和返回值。 不过,有些类型声明的细节(比如,numeric 类型的精度域)是由下层函数实现负责的, 并且会被 CREATE FUNCTION 命令悄悄地吞掉。 (也就是说,不再被识别或强制)。

PostgreSQL 允许函数重载; 也就是说,同一个函数名可以用于几个不同的函数, 只要它们的参数可以区分它们。不过,所有函数的 C 名字必须不同,
也就是说你必须给予重载的 C 函数不同的 C 名字(比如,使用参数类型作为 C 名字的一部分)。

如果重复调用 CREATE FUNCTION,并且都指向同一个目标文件, 那么该文件只装载一次。要卸载和恢复装载该文件(可能是在开发过程中),你可以使用 LOAD [load(7)] 命令。

使用 DROP FUNCTION 删除一个用户定义函数。

函数定义里面的任何单引号或者反斜杠都必须用写双份的方式逃逸。

要能定义函数,用户必须对该语言有 USAGE  权限。

EXAMPLES 例子

这里是一个简单的例子,用于帮助你开始掌握这个命令。 更多信息和例子,参阅 ``User-Defined Functions''。

CREATE FUNCTION add(integer, integer) RETURNS integer
AS 'select $1 + $2;'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;

CREATE FUNCTION - 定义一个新函数的更多相关文章

  1. CREATE AGGREGATE - 定义一个新的聚集函数

    SYNOPSIS CREATE AGGREGATE name ( BASETYPE = input_data_type, SFUNC = sfunc, STYPE = state_data_type ...

  2. CREATE OPERATOR - 定义一个新的操作符

    SYNOPSIS CREATE OPERATOR name ( PROCEDURE = funcname [, LEFTARG = lefttype ] [, RIGHTARG = righttype ...

  3. CREATE TRIGGER - 定义一个新的触发器

    SYNOPSIS CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] } ON table [ FOR [ EACH ] { ROW | ...

  4. CREATE RULE - 定义一个新的重写规则

    SYNOPSIS CREATE [ OR REPLACE ] RULE name AS ON event TO table [ WHERE condition ] DO [ INSTEAD ] { N ...

  5. CREATE DOMAIN - 定义一个新域

    SYNOPSIS CREATE DOMAIN name [AS] data_type [ DEFAULT expression ] [ constraint [ ... ] ] where const ...

  6. CREATE TYPE - 定义一个新的数据类型

    SYNOPSIS CREATE TYPE name AS ( attribute_name data_type [, ... ] ) CREATE TYPE name ( INPUT = input_ ...

  7. CREATE SCHEMA - 定义一个新的模式

    SYNOPSIS CREATE SCHEMA schemaname [ AUTHORIZATION username ] [ schema_element [ ... ] ] CREATE SCHEM ...

  8. CREATE TABLE - 定义一个新表

    SYNOPSIS CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name ( { column_name data_ty ...

  9. CREATE GROUP - 定义一个新的用户组

    SYNOPSIS CREATE GROUP name [ [ WITH ] option [ ... ] ] where option can be: SYSID gid | USER usernam ...

随机推荐

  1. bzoj3330: [BeiJing2013]分数

    口胡 题目hint都给你是一个三分函数了 还不会上三分套三分吗 exp函数又卡 精度又卡 什么sb毒瘤题 浪费时间

  2. 【SCOI 2003】 严格n元树

    [题目链接] 点击打开链接 [算法] f[i]表示深度小于等于i的严格n元树 显然,一棵深度小于等于i的严格n元树,就是一个根节点,下面有n棵子树,这n棵子树都是深度小于等于i-1的严格n元树,每棵子 ...

  3. asp.net web.config配置节说明(转发)

    原文地址:http://www.cnblogs.com/qingyuan/articles/1501644.html web.config 文件查找规则:      (1)如果在当前页面所在目录下存在 ...

  4. ubuntu12.04中极品五笔简体繁体切换

    不小心切换成了繁体,按Ctrl+:,可以切换回来.

  5. MySQL(调优慢查询、explain profile) 转

    转自http://www.linuxidc.com/Linux/2012-09/70459.htm mysql profile explain slow_query_log分析优化查询 在做性能测试中 ...

  6. WPF-按钮美化

    我们不多哔哔,先放图: 美化按钮背景: 当我们用系统默认的按钮风格似乎太老套,而且不太美观,某些情况下我们需要对按钮进行美化和重绘,只有这样才能满足我们的需要 按钮美化思维引导: 图中1 为控件Bor ...

  7. hibernate简单实现连接数据库,并实现数据的操作

    1:创建实体类 package com.yinfu.entity; public class User { private int id; private String username; priva ...

  8. 【SpringCloud构建微服务系列】使用Spring Cloud Config统一管理服务配置

    一.为什么要统一管理微服务配置 对于传统的单体应用而言,常使用配置文件来管理所有配置,比如SpringBoot的application.yml文件,但是在微服务架构中全部手动修改的话很麻烦而且不易维护 ...

  9. ROS学习笔记二:ROS系统架构及概念

    本文主要是了解ROS的系统架构.文件夹结构以及工作所需的核心文件. ROS系统架构主要被设计和划分为三部分,每一部分代表一个层级的概念:文件系统级(The filesystem level).计算图级 ...

  10. c#如何使用replace函数将"\"替换成"\\"

    当我使用 String str="c:\aa.xls"; str=str.Replace("\","\\");时,括号为红色错误的,那么如何 ...