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 - 定义一个新函数的更多相关文章
-
CREATE AGGREGATE - 定义一个新的聚集函数
SYNOPSIS CREATE AGGREGATE name ( BASETYPE = input_data_type, SFUNC = sfunc, STYPE = state_data_type ...
-
CREATE OPERATOR - 定义一个新的操作符
SYNOPSIS CREATE OPERATOR name ( PROCEDURE = funcname [, LEFTARG = lefttype ] [, RIGHTARG = righttype ...
-
CREATE TRIGGER - 定义一个新的触发器
SYNOPSIS CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] } ON table [ FOR [ EACH ] { ROW | ...
-
CREATE RULE - 定义一个新的重写规则
SYNOPSIS CREATE [ OR REPLACE ] RULE name AS ON event TO table [ WHERE condition ] DO [ INSTEAD ] { N ...
-
CREATE DOMAIN - 定义一个新域
SYNOPSIS CREATE DOMAIN name [AS] data_type [ DEFAULT expression ] [ constraint [ ... ] ] where const ...
-
CREATE TYPE - 定义一个新的数据类型
SYNOPSIS CREATE TYPE name AS ( attribute_name data_type [, ... ] ) CREATE TYPE name ( INPUT = input_ ...
-
CREATE SCHEMA - 定义一个新的模式
SYNOPSIS CREATE SCHEMA schemaname [ AUTHORIZATION username ] [ schema_element [ ... ] ] CREATE SCHEM ...
-
CREATE TABLE - 定义一个新表
SYNOPSIS CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name ( { column_name data_ty ...
-
CREATE GROUP - 定义一个新的用户组
SYNOPSIS CREATE GROUP name [ [ WITH ] option [ ... ] ] where option can be: SYSID gid | USER usernam ...
随机推荐
-
Android之ViewDragHelper
在自定义ViewGroup中,很多效果都包含用户手指去拖动其内部的某个View(eg:侧滑菜单等),针对具体的需要去写好onInterceptTouchEvent和onTouchEvent这两个方法是 ...
-
HYSBZ 1036 【树链剖分】
思路: 裸裸的树链剖分.... 树链剖分就是把一棵树分成若干重链和轻链...然后保证形成的线段树上每条链是连续存储的.然后这样就能用线段树进行维护了. 但是每次一定要保证是在同一条链里边....思路就 ...
-
signed char、unsigned char
什么是无符号char类型?与常见的char类型有何不同? 在c++中有三种不同的字符类型:char,signed char,unsigned char.如果要应用与文本字符,就使用不加限制的char类 ...
-
看看baidu是如何AJAX跨域的[转]
看看baidu是如何AJAX跨域的 最近做个人网站遇到AJAX跨子域名的问题. 偶尔看到baidu的通行证处理都是在二级域名passport.baidu.com中处理的, 但是baidu很多地方登录都 ...
-
Some good iOS questions
这里,我列举了一些在*中一些比较好的关于iOS的问题.大部分我列举的问题都是关于Objective C.所有问题中,我比较喜欢“为什么”这一类型的问题. 问题 1. What’ ...
-
20151120 jsp相关
jsp 声明表示.代码片段及引用 <%@ page language="java" contentType="text/html; charset=UTF-8&qu ...
-
线程池ThreadPoolExecutor源码解读研究(JDK1.8)
一.什么是线程池 为什么要使用线程池?在多线程并发开发中,线程的数量较多,且每个线程执行一定的时间后就结束了,下一个线程任务到来还需要重新创建线程,这样线程数量特别庞大的时候,频繁的创建线程和销毁线程 ...
-
Python—day18 dandom、shutil、shelve、系统标准流、logging
一.dandom模块 (0, 1) 小数:random.random() [1, 10] 整数:random.randint(1, 10) [1, 10) 整数:random.randrange(1, ...
-
5.机器学习——DBSCAN聚类算法
1.优缺点 优点: (1)聚类速度快且能够有效处理噪声点和发现任意形状的空间聚类: (2)与K-MEANS比较起来,不需要输入要划分的聚类个数: (3)聚类簇的形状没有偏倚: (4)可以在需要时输入过 ...
-
JPA 连表查询
A表和B表 @Entity @Table(name = "A", schema = "kps", catalog = "kps") @Dyn ...